diff --git a/pom.xml b/pom.xml index cf5a153..238372c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,8 +10,8 @@ A voxel game implementation of the Ginger3D engine by hYdos http://maven.apache.org - 11 - 11 + 13 + 13 3.2.4-SNAPSHOT 1.9.20 diff --git a/src/main/java/com/github/halotroop/litecraft/Litecraft.java b/src/main/java/com/github/halotroop/litecraft/Litecraft.java index 28b431f..79e002c 100644 --- a/src/main/java/com/github/halotroop/litecraft/Litecraft.java +++ b/src/main/java/com/github/halotroop/litecraft/Litecraft.java @@ -22,8 +22,6 @@ import com.github.hydos.ginger.engine.opengl.postprocessing.PostProcessing; import com.github.hydos.ginger.engine.opengl.render.MasterRenderer; import com.github.hydos.ginger.engine.opengl.render.models.GLTexturedModel; import com.github.hydos.ginger.engine.opengl.utils.GLLoader; -import com.github.hydos.ginger.engine.vulkan.api.GingerVK; - import tk.valoeghese.gateways.client.io.*; public class Litecraft extends Game @@ -152,7 +150,6 @@ public class Litecraft extends Game } case Vulkan: { - this.engine = new GingerVK(); // TODO: Setup Vulkan exit(); break; diff --git a/src/main/java/com/github/hydos/ginger/VulkanStarter.java b/src/main/java/com/github/hydos/ginger/VulkanStarter.java index e6fda58..2470024 100644 --- a/src/main/java/com/github/hydos/ginger/VulkanStarter.java +++ b/src/main/java/com/github/hydos/ginger/VulkanStarter.java @@ -1,406 +1,60 @@ package com.github.hydos.ginger; -import java.io.IOException; -import java.nio.*; - -import org.lwjgl.PointerBuffer; -import org.lwjgl.glfw.*; -import org.lwjgl.system.MemoryUtil; -import org.lwjgl.vulkan.*; +import org.lwjgl.glfw.GLFW; import com.github.hydos.ginger.engine.common.info.RenderAPI; import com.github.hydos.ginger.engine.common.io.Window; -import com.github.hydos.ginger.engine.common.obj.ModelLoader; -import com.github.hydos.ginger.engine.vulkan.*; -import com.github.hydos.ginger.engine.vulkan.api.GingerVK; -import com.github.hydos.ginger.engine.vulkan.model.*; -import com.github.hydos.ginger.engine.vulkan.registers.VKRegister; -import com.github.hydos.ginger.engine.vulkan.render.RenderUtils; -import com.github.hydos.ginger.engine.vulkan.render.renderers.*; -import com.github.hydos.ginger.engine.vulkan.render.ubo.*; -import com.github.hydos.ginger.engine.vulkan.shaders.*; -import com.github.hydos.ginger.engine.vulkan.utils.*; +import com.github.hydos.ginger.engine.vulkan.api.GingerVk; /** @author hydos06 * the non ARR vulkan test example */ public class VulkanStarter { - public static boolean getSupportedDepthFormat(VkPhysicalDevice physicalDevice, IntBuffer depthFormat) - { - // Since all depth formats may be optional, we need to find a suitable depth format to use - // Start with the highest precision packed format - int[] depthFormats = - { - VK12.VK_FORMAT_D32_SFLOAT_S8_UINT, - VK12.VK_FORMAT_D32_SFLOAT, - VK12.VK_FORMAT_D24_UNORM_S8_UINT, - VK12.VK_FORMAT_D16_UNORM_S8_UINT, - VK12.VK_FORMAT_D16_UNORM - }; - VkFormatProperties formatProps = VkFormatProperties.calloc(); - for (int format : depthFormats) - { - VK12.vkGetPhysicalDeviceFormatProperties(physicalDevice, format, formatProps); - // Format must support depth stencil attachment for optimal tiling - if ((formatProps.optimalTilingFeatures() & VK12.VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0) - { - depthFormat.put(0, format); - return true; - } - } - return false; - } + private static class HelloTriangleApplication { - public static class ColorAndDepthFormatAndSpace - { - public int colorFormat; - public int colorSpace; - public int depthFormat; - } + private static final int WIDTH = 800; + private static final int HEIGHT = 600; - private static long createCommandPool(VkDevice device, int queueNodeIndex) - { - VkCommandPoolCreateInfo cmdPoolInfo = VkCommandPoolCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO) - .queueFamilyIndex(queueNodeIndex) - .flags(VK12.VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); - LongBuffer pCmdPool = MemoryUtil.memAllocLong(1); - int err = VK12.vkCreateCommandPool(device, cmdPoolInfo, null, pCmdPool); - long commandPool = pCmdPool.get(0); - cmdPoolInfo.free(); - MemoryUtil.memFree(pCmdPool); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create command pool: " + VKUtils.translateVulkanResult(err)); } - return commandPool; - } + // ======= FIELDS ======= // - private static VkQueue createDeviceQueue(VkDevice device, int queueFamilyIndex) - { - PointerBuffer pQueue = MemoryUtil.memAllocPointer(1); - VK12.vkGetDeviceQueue(device, queueFamilyIndex, 0, pQueue); - long queue = pQueue.get(0); - MemoryUtil.memFree(pQueue); - return new VkQueue(queue, device); - } + private long window; - private static VkCommandBuffer createCommandBuffer(VkDevice device, long commandPool) - { - VkCommandBufferAllocateInfo cmdBufAllocateInfo = VkCommandBufferAllocateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO) - .commandPool(commandPool) - .level(VK12.VK_COMMAND_BUFFER_LEVEL_PRIMARY) - .commandBufferCount(1); - PointerBuffer pCommandBuffer = MemoryUtil.memAllocPointer(1); - int err = VK12.vkAllocateCommandBuffers(device, cmdBufAllocateInfo, pCommandBuffer); - cmdBufAllocateInfo.free(); - long commandBuffer = pCommandBuffer.get(0); - MemoryUtil.memFree(pCommandBuffer); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to allocate command buffer: " + VKUtils.translateVulkanResult(err)); } - return new VkCommandBuffer(commandBuffer, device); - } + // ======= METHODS ======= // - public static class Swapchain - { - public long swapchainHandle; - public long[] images; - public long[] imageViews; - } + public void run() { + Window.create(WIDTH, HEIGHT, "V u l k a n", 60, RenderAPI.Vulkan); + initVulkan(); + mainLoop(); + cleanup(); + } - public static class DepthStencil - { - public long view; - } + private void initVulkan() { + new GingerVk().start("Vulkan demo"); + } - private static void submitCommandBuffer(VkQueue queue, VkCommandBuffer commandBuffer) - { - if (commandBuffer == null || commandBuffer.address() == MemoryUtil.NULL) - return; - VkSubmitInfo submitInfo = VkSubmitInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_SUBMIT_INFO); - PointerBuffer pCommandBuffers = MemoryUtil.memAllocPointer(1) - .put(commandBuffer) - .flip(); - submitInfo.pCommandBuffers(pCommandBuffers); - int err = VK12.vkQueueSubmit(queue, submitInfo, VK12.VK_NULL_HANDLE); - MemoryUtil.memFree(pCommandBuffers); - submitInfo.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to submit command buffer: " + VKUtils.translateVulkanResult(err)); } - } + private void mainLoop() { - private static long createDescriptorPool(VkDevice device) - { - // We need to tell the API the number of max. requested descriptors per type - VkDescriptorPoolSize.Buffer typeCounts = VkDescriptorPoolSize.calloc(1) - // This example only uses one descriptor type (uniform buffer) and only - // requests one descriptor of this type - .type(VK12.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) - .descriptorCount(1); - // For additional types you need to add new entries in the type count list - // E.g. for two combined image samplers : - // typeCounts[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - // typeCounts[1].descriptorCount = 2; - // Create the global descriptor pool - // All descriptors used in this example are allocated from this pool - VkDescriptorPoolCreateInfo descriptorPoolInfo = VkDescriptorPoolCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO) - .pPoolSizes(typeCounts) - // Set the max. number of sets that can be requested - // Requesting descriptors beyond maxSets will result in an error - .maxSets(1); - LongBuffer pDescriptorPool = MemoryUtil.memAllocLong(1); - int err = VK12.vkCreateDescriptorPool(device, descriptorPoolInfo, null, pDescriptorPool); - long descriptorPool = pDescriptorPool.get(0); - MemoryUtil.memFree(pDescriptorPool); - descriptorPoolInfo.free(); - typeCounts.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create descriptor pool: " + VKUtils.translateVulkanResult(err)); } - return descriptorPool; - } + while(!Window.closed()) { + if(Window.shouldRender()) { + Window.update(); + } + } - private static long createDescriptorSet(VkDevice device, long descriptorPool, long descriptorSetLayout, UboDescriptor uniformDataVSDescriptor) - { - LongBuffer pDescriptorSetLayout = MemoryUtil.memAllocLong(1); - pDescriptorSetLayout.put(0, descriptorSetLayout); - VkDescriptorSetAllocateInfo allocInfo = VkDescriptorSetAllocateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO) - .descriptorPool(descriptorPool) - .pSetLayouts(pDescriptorSetLayout); - LongBuffer pDescriptorSet = MemoryUtil.memAllocLong(1); - int err = VK12.vkAllocateDescriptorSets(device, allocInfo, pDescriptorSet); - long descriptorSet = pDescriptorSet.get(0); - MemoryUtil.memFree(pDescriptorSet); - allocInfo.free(); - MemoryUtil.memFree(pDescriptorSetLayout); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create descriptor set: " + VKUtils.translateVulkanResult(err)); } - // Update descriptor sets determining the shader binding points - // For every binding point used in a shader there needs to be one - // descriptor set matching that binding point - VkDescriptorBufferInfo.Buffer descriptor = VkDescriptorBufferInfo.calloc(1) - .buffer(uniformDataVSDescriptor.buffer) - .range(uniformDataVSDescriptor.range) - .offset(uniformDataVSDescriptor.offset); - // Binding 0 : Uniform buffer - VkWriteDescriptorSet.Buffer writeDescriptorSet = VkWriteDescriptorSet.calloc(1) - .sType(VK12.VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET) - .dstSet(descriptorSet) - .descriptorCount(1) - .descriptorType(VK12.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) - .pBufferInfo(descriptor) - .dstBinding(0); // Binds this uniform buffer to binding point 0 - VK12.vkUpdateDescriptorSets(device, writeDescriptorSet, null); - writeDescriptorSet.free(); - descriptor.free(); - return descriptorSet; - } + } - private static long createDescriptorSetLayout(VkDevice device) - { - int err; - // One binding for a UBO used in a vertex shader - VkDescriptorSetLayoutBinding.Buffer layoutBinding = VkDescriptorSetLayoutBinding.calloc(1) - .binding(ShaderType.vertexShader) // <- Binding 0 : Uniform buffer (Vertex shader) - .descriptorType(VK12.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) - .descriptorCount(1) - .stageFlags(VK12.VK_SHADER_STAGE_VERTEX_BIT); - // Build a create-info struct to create the descriptor set layout - VkDescriptorSetLayoutCreateInfo descriptorLayout = VkDescriptorSetLayoutCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO) - .pBindings(layoutBinding); - LongBuffer pDescriptorSetLayout = MemoryUtil.memAllocLong(1); - err = VK12.vkCreateDescriptorSetLayout(device, descriptorLayout, null, pDescriptorSetLayout); - long descriptorSetLayout = pDescriptorSetLayout.get(0); - MemoryUtil.memFree(pDescriptorSetLayout); - descriptorLayout.free(); - layoutBinding.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create descriptor set layout: " + VKUtils.translateVulkanResult(err)); } - return descriptorSetLayout; - } + private void cleanup() { - /* - * All resources that must be reallocated on window resize. - */ - private static Swapchain swapchain; - private static long[] framebuffers; - private static VkCommandBuffer[] renderCommandBuffers; - private static DepthStencil depthStencil; + GLFW.glfwDestroyWindow(window); - public static void main(String[] args) throws IOException - { - Window.create(1200, 600, "Litecraft Vulkan", 60, RenderAPI.Vulkan); - new GingerVK(); - VKRegister.exampleVKModel = new VKModelData(); - /* Look for instance extensions */ - PointerBuffer requiredExtensions = GLFWVulkan.glfwGetRequiredInstanceExtensions(); - if (requiredExtensions == null) - { throw new AssertionError("Failed to find list of required Vulkan extensions"); } - // Create the Vulkan instance - final VkInstance vulkanInstance = VKLoader.createInstance(requiredExtensions); - VKUtils.setupVulkanDebugCallback(); - final long debugCallbackHandle = VKUtils.startVulkanDebugging(vulkanInstance, EXTDebugReport.VK_DEBUG_REPORT_ERROR_BIT_EXT | EXTDebugReport.VK_DEBUG_REPORT_WARNING_BIT_EXT, VKConstants.debugCallback); - VKRegister.physicalDevice = VKDeviceProperties.getFirstPhysicalDevice(vulkanInstance); - final VKDeviceProperties deviceAndGraphicsQueueFamily = VKDeviceProperties.initDeviceProperties(VKRegister.physicalDevice); - VKRegister.device = deviceAndGraphicsQueueFamily.device; - int queueFamilyIndex = deviceAndGraphicsQueueFamily.queueFamilyIndex; - final VkPhysicalDeviceMemoryProperties memoryProperties = deviceAndGraphicsQueueFamily.memoryProperties; - GLFWKeyCallback keyCallback; - GLFW.glfwSetKeyCallback(Window.getWindow(), keyCallback = new GLFWKeyCallback() - { - public void invoke(long window, int key, int scancode, int action, int mods) - { - if (action != GLFW.GLFW_RELEASE) - return; - if (key == GLFW.GLFW_KEY_ESCAPE) - GLFW.glfwSetWindowShouldClose(window, true); - } - }); - LongBuffer pSurface = MemoryUtil.memAllocLong(1); - int err = GLFWVulkan.glfwCreateWindowSurface(vulkanInstance, Window.getWindow(), null, pSurface); - final long surface = pSurface.get(0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create surface: " + VKUtils.translateVulkanResult(err)); } - // Create static Vulkan resources - final ColorAndDepthFormatAndSpace colorAndDepthFormatAndSpace = VKMasterRenderer.getColorFormatAndSpace(VKRegister.physicalDevice, surface); - VKRegister.commandPool = createCommandPool(VKRegister.device, queueFamilyIndex); - final VkCommandBuffer setupCommandBuffer = createCommandBuffer(VKRegister.device, VKRegister.commandPool); - VKRegister.queue = createDeviceQueue(VKRegister.device, queueFamilyIndex); - final long renderPass = RenderUtils.createRenderPass(VKRegister.device, colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.depthFormat); - final long renderCommandPool = createCommandPool(VKRegister.device, queueFamilyIndex); - VKVertices vertices = VKModelConverter.convertModel(ModelLoader.getCubeMesh(), memoryProperties, VKRegister.device); - Ubo ubo = new Ubo(memoryProperties, VKRegister.device); - final long descriptorPool = createDescriptorPool(VKRegister.device); - final long descriptorSetLayout = createDescriptorSetLayout(VKRegister.device); - final long descriptorSet = createDescriptorSet(VKRegister.device, descriptorPool, descriptorSetLayout, ubo.uboData); - final Pipeline pipeline = Pipeline.createPipeline(VKRegister.device, renderPass, vertices.createInfo, descriptorSetLayout); - VKRegister.exampleVKModel.loadModel(); - final class SwapchainRecreator - { - boolean mustRecreate = true; + GLFW.glfwTerminate(); + } - void recreate() - { - // Begin the setup command buffer (the one we will use for swapchain/framebuffer creation) - VkCommandBufferBeginInfo cmdBufInfo = VkCommandBufferBeginInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO); - int err = VK12.vkBeginCommandBuffer(setupCommandBuffer, cmdBufInfo); - cmdBufInfo.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to begin setup command buffer: " + VKUtils.translateVulkanResult(err)); } - long oldChain = swapchain != null ? swapchain.swapchainHandle : VK12.VK_NULL_HANDLE; - // Create the swapchain (this will also add a memory barrier to initialize the framebuffer images) - swapchain = VKMasterRenderer.createSwapChain(VKRegister.device, VKRegister.physicalDevice, surface, oldChain, setupCommandBuffer, - Window.getWidth(), Window.getHeight(), colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.colorSpace); - // Create depth-stencil image - depthStencil = VKMasterRenderer.createDepthStencil(VKRegister.device, memoryProperties, colorAndDepthFormatAndSpace.depthFormat, setupCommandBuffer); - err = VK12.vkEndCommandBuffer(setupCommandBuffer); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to end setup command buffer: " + VKUtils.translateVulkanResult(err)); } - submitCommandBuffer(VKRegister.queue, setupCommandBuffer); - VK12.vkQueueWaitIdle(VKRegister.queue); - if (framebuffers != null) - { for (int i = 0; i < framebuffers.length; i++) - VK12.vkDestroyFramebuffer(VKRegister.device, framebuffers[i], null); } - framebuffers = RenderUtils.createFramebuffers(VKRegister.device, swapchain, renderPass, Window.getWidth(), Window.getHeight(), depthStencil); - // Create render command buffers - if (renderCommandBuffers != null) - { VK12.vkResetCommandPool(VKRegister.device, renderCommandPool, VKUtils.VK_FLAGS_NONE); } - renderCommandBuffers = VKUtils.setupRenderCommandBuffer(VKRegister.device, renderCommandPool, framebuffers, renderPass, Window.getWidth(), Window.getHeight(), pipeline, descriptorSet, - vertices.vkVerticiesBuffer); - mustRecreate = false; - } - } - final SwapchainRecreator swapchainRecreator = new SwapchainRecreator(); - // Handle canvas resize - GLFWFramebufferSizeCallback framebufferSizeCallback = new GLFWFramebufferSizeCallback() - { - public void invoke(long window, int width, int height) - { - if (width <= 0 || height <= 0) - return; - swapchainRecreator.mustRecreate = true; - } - }; - GLFW.glfwSetFramebufferSizeCallback(Window.getWindow(), framebufferSizeCallback); - GLFW.glfwShowWindow(Window.getWindow()); - // Pre-allocate everything needed in the render loop - IntBuffer pImageIndex = MemoryUtil.memAllocInt(1); - int currentBuffer = 0; - PointerBuffer pCommandBuffers = MemoryUtil.memAllocPointer(1); - LongBuffer pSwapchains = MemoryUtil.memAllocLong(1); - LongBuffer pImageAcquiredSemaphore = MemoryUtil.memAllocLong(1); - LongBuffer pRenderCompleteSemaphore = MemoryUtil.memAllocLong(1); - // Info struct to create a semaphore - VkSemaphoreCreateInfo semaphoreCreateInfo = VkSemaphoreCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO); - // Info struct to submit a command buffer which will wait on the semaphore - IntBuffer pWaitDstStageMask = MemoryUtil.memAllocInt(1); - pWaitDstStageMask.put(0, VK12.VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); - VkSubmitInfo submitInfo = VkSubmitInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_SUBMIT_INFO) - .waitSemaphoreCount(pImageAcquiredSemaphore.remaining()) - .pWaitSemaphores(pImageAcquiredSemaphore) - .pWaitDstStageMask(pWaitDstStageMask) - .pCommandBuffers(pCommandBuffers) - .pSignalSemaphores(pRenderCompleteSemaphore); - // Info struct to present the current swapchain image to the display - VkPresentInfoKHR presentInfo = VkPresentInfoKHR.calloc() - .sType(KHRSwapchain.VK_STRUCTURE_TYPE_PRESENT_INFO_KHR) - .pWaitSemaphores(pRenderCompleteSemaphore) - .swapchainCount(pSwapchains.remaining()) - .pSwapchains(pSwapchains) - .pImageIndices(pImageIndex) - .pResults(null); - // The render loop - long lastTime = System.nanoTime(); - float time = 0.0f; - while (!GLFW.glfwWindowShouldClose(Window.getWindow())) - { - Window.update(); - if (swapchainRecreator.mustRecreate) - swapchainRecreator.recreate(); - - - err = VK12.vkCreateSemaphore(VKRegister.device, semaphoreCreateInfo, null, pImageAcquiredSemaphore); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create image acquired semaphore: " + VKUtils.translateVulkanResult(err)); } - // Create a semaphore to wait for the render to complete, before presenting - err = VK12.vkCreateSemaphore(VKRegister.device, semaphoreCreateInfo, null, pRenderCompleteSemaphore); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create render complete semaphore: " + VKUtils.translateVulkanResult(err)); } - // Get next image from the swap chain (back/front buffer). - // This will setup the imageAquiredSemaphore to be signalled when the operation is complete - err = KHRSwapchain.vkAcquireNextImageKHR(VKRegister.device, swapchain.swapchainHandle, VKConstants.MAX_UNSIGNED_INT, pImageAcquiredSemaphore.get(0), VK12.VK_NULL_HANDLE, pImageIndex); - currentBuffer = pImageIndex.get(0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to acquire next swapchain image: " + VKUtils.translateVulkanResult(err)); } - // Select the command buffer for the current framebuffer image/attachment - pCommandBuffers.put(0, renderCommandBuffers[currentBuffer]); - // Update UBO - long thisTime = System.nanoTime(); - time += (thisTime - lastTime) / 1E9f; - lastTime = thisTime; - ubo.updateUbo(VKRegister.device, time); - // Submit to the graphics queue - - err = VK12.vkQueueSubmit(VKRegister.queue, submitInfo, VK12.VK_NULL_HANDLE); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to submit render queue: " + VKUtils.translateVulkanResult(err)); } - // Present the current buffer to the swap chain - // This will display the image - pSwapchains.put(0, swapchain.swapchainHandle); - err = KHRSwapchain.vkQueuePresentKHR(VKRegister.queue, presentInfo); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to present the swapchain image: " + VKUtils.translateVulkanResult(err)); } - // Create and submit post present barrier - VK12.vkQueueWaitIdle(VKRegister.queue); - // Destroy this semaphore (we will create a new one in the next frame) - VK12.vkDestroySemaphore(VKRegister.device, pImageAcquiredSemaphore.get(0), null); - VK12.vkDestroySemaphore(VKRegister.device, pRenderCompleteSemaphore.get(0), null); - } - ((GingerVK)GingerVK.getInstance()).end(pWaitDstStageMask, pImageAcquiredSemaphore, pRenderCompleteSemaphore, pSwapchains, pCommandBuffers, semaphoreCreateInfo, submitInfo, presentInfo, vulkanInstance, debugCallbackHandle, framebufferSizeCallback, keyCallback); - } + } + + public static void main(String[] args) { + + HelloTriangleApplication app = new HelloTriangleApplication(); + + app.run(); + } } \ No newline at end of file diff --git a/src/main/java/com/github/hydos/ginger/engine/common/obj/ModelLoader.java b/src/main/java/com/github/hydos/ginger/engine/common/obj/ModelLoader.java index ddf8e08..e0b14ca 100644 --- a/src/main/java/com/github/hydos/ginger/engine/common/obj/ModelLoader.java +++ b/src/main/java/com/github/hydos/ginger/engine/common/obj/ModelLoader.java @@ -23,4 +23,9 @@ public class ModelLoader Mesh data = OBJFileLoader.loadModel(objPath); return new GLTexturedModel(GLLoader.loadToVAO(data.getVertices(), data.getIndices(), data.getNormals(), data.getTextureCoords()), new ModelTexture(texturePath)); } + + public static Mesh loadMesh(String meshPath) { + Mesh data = OBJFileLoader.loadModel(meshPath); + return data; + } } diff --git a/src/main/java/com/github/hydos/ginger/engine/common/obj/OBJFileLoader.java b/src/main/java/com/github/hydos/ginger/engine/common/obj/OBJFileLoader.java index bc0ec3e..a2cb7d2 100644 --- a/src/main/java/com/github/hydos/ginger/engine/common/obj/OBJFileLoader.java +++ b/src/main/java/com/github/hydos/ginger/engine/common/obj/OBJFileLoader.java @@ -6,7 +6,7 @@ import org.lwjgl.assimp.AIVector3D.Buffer; public class OBJFileLoader { - public static String resourceLocation = "~/Desktop/Ginger3D/src/main/resources/models/"; + public static String resourceLocation = "C:/Users/Hayden/Desktop/Litecraft3D/src/main/resources/models/"; public static Mesh loadModel(String filePath) { @@ -15,7 +15,10 @@ public class OBJFileLoader { scene = Assimp.aiImportFile(resourceLocation + filePath, Assimp.aiProcess_JoinIdenticalVertices | Assimp.aiProcess_Triangulate); if (scene == null) - { return new Mesh(new float[0], new float[0], new float[0], new int[0], 1F); } + { + System.err.println("The model " + resourceLocation + filePath + " has failed to load"); + return new Mesh(new float[0], new float[0], new float[0], new int[0], 1F); + } AIMesh mesh = AIMesh.create(scene.mMeshes().get(0)); int vertexCount = mesh.mNumVertices(); AIVector3D.Buffer vertices = mesh.mVertices(); diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/VKConstants.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/VKConstants.java index c1d7647..9cc0d63 100644 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/VKConstants.java +++ b/src/main/java/com/github/hydos/ginger/engine/vulkan/VKConstants.java @@ -1,17 +1,15 @@ package com.github.hydos.ginger.engine.vulkan; -import java.nio.ByteBuffer; +import org.lwjgl.vulkan.*; -import org.lwjgl.system.MemoryUtil; -import org.lwjgl.vulkan.VkDebugReportCallbackEXT; - -public class VKConstants +public class VkConstants { - public static boolean debug = System.getProperty("NDEBUG") == null; - public static ByteBuffer[] layers = - { - MemoryUtil.memUTF8("VK_LAYER_LUNARG_standard_validation"), - }; - public static VkDebugReportCallbackEXT debugCallback; - public static final long MAX_UNSIGNED_INT = -1L; -} + + public static VkInstance vulkanInstance; + public static VkPhysicalDevice physicalDevice; + public static VkDevice device; + public static VkQueue graphicsQueue; + public static long windowSurface; + public static VkQueue presentQueue; + +} \ No newline at end of file diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/VKRenderRegister.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/VKRenderRegister.java deleted file mode 100644 index d7d71cd..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/VKRenderRegister.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan; - -import org.lwjgl.vulkan.VkQueue; - -public class VKRenderRegister -{ - public static VkQueue renderQueue;//used for queueing up render updates - - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/api/GingerVK.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/api/GingerVK.java index c52a798..e2923b8 100644 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/api/GingerVK.java +++ b/src/main/java/com/github/hydos/ginger/engine/vulkan/api/GingerVK.java @@ -1,64 +1,18 @@ package com.github.hydos.ginger.engine.vulkan.api; -import java.nio.IntBuffer; -import java.nio.LongBuffer; +import com.github.hydos.ginger.engine.vulkan.io.VkWindow; +import com.github.hydos.ginger.engine.vulkan.utils.VkUtils; -import org.lwjgl.PointerBuffer; -import org.lwjgl.glfw.GLFW; -import org.lwjgl.glfw.GLFWFramebufferSizeCallback; -import org.lwjgl.glfw.GLFWKeyCallback; -import org.lwjgl.system.MemoryUtil; -import org.lwjgl.vulkan.EXTDebugReport; -import org.lwjgl.vulkan.VkInstance; -import org.lwjgl.vulkan.VkPresentInfoKHR; -import org.lwjgl.vulkan.VkSemaphoreCreateInfo; -import org.lwjgl.vulkan.VkSubmitInfo; - -import com.github.hydos.ginger.engine.common.api.GingerEngine; -import com.github.hydos.ginger.engine.common.api.game.Game; -import com.github.hydos.ginger.engine.common.io.Window; -import com.github.hydos.ginger.engine.common.screen.Screen; - -public class GingerVK extends GingerEngine +public class GingerVk { - public GingerVK() - { - INSTANCE = this; + + public void start(String gameName) { + System.out.println("Game " + gameName + " successfuly started in Vulkan mode."); + VkUtils.createInstance(); + VkWindow.createSurface(); + VkUtils.createPhysicalDevice(); + VkUtils.createLogicalDevice(); } - - public void end(IntBuffer pWaitDstStageMask, LongBuffer pImageAcquiredSemaphore, LongBuffer pRenderCompleteSemaphore, LongBuffer pSwapchains, PointerBuffer pCommandBuffers, VkSemaphoreCreateInfo semaphoreCreateInfo, VkSubmitInfo submitInfo, VkPresentInfoKHR presentInfo, VkInstance vulkanInstance, long debugCallbackHandle, GLFWFramebufferSizeCallback framebufferSizeCallback, GLFWKeyCallback keyCallback) - { - MemoryUtil.memFree(pWaitDstStageMask); - MemoryUtil.memFree(pImageAcquiredSemaphore); - MemoryUtil.memFree(pRenderCompleteSemaphore); - MemoryUtil.memFree(pSwapchains); - MemoryUtil.memFree(pCommandBuffers); - semaphoreCreateInfo.free(); - submitInfo.free(); - presentInfo.free(); - EXTDebugReport.vkDestroyDebugReportCallbackEXT(vulkanInstance, debugCallbackHandle, null); - framebufferSizeCallback.free(); - keyCallback.free(); - GLFW.glfwDestroyWindow(Window.getWindow()); - GLFW.glfwTerminate(); - } - - @Override - public void cleanup() - { - // TODO - } - - @Override - public void openScreen(Screen screen) - { - // TODO - } - - @Override - public void renderOverlays(Game game) - { - // TODO - } - + + } diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/io/VkWindow.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/io/VkWindow.java new file mode 100644 index 0000000..f54b79c --- /dev/null +++ b/src/main/java/com/github/hydos/ginger/engine/vulkan/io/VkWindow.java @@ -0,0 +1,35 @@ +package com.github.hydos.ginger.engine.vulkan.io; + +import java.nio.LongBuffer; + +import org.lwjgl.glfw.GLFWVulkan; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.vulkan.VK12; + +import com.github.hydos.ginger.engine.common.io.Window; +import com.github.hydos.ginger.engine.vulkan.VkConstants; +import com.github.hydos.ginger.engine.vulkan.utils.VkUtils; + +/** + * used for window related vulkan only things + * @author hydos + * + */ +public class VkWindow +{ + public static void createSurface() + { + try(MemoryStack stack = MemoryStack.stackPush()) + { + LongBuffer pSurface = stack.longs(VK12.VK_NULL_HANDLE); + + int status = GLFWVulkan.glfwCreateWindowSurface(VkConstants.vulkanInstance, Window.getWindow(), null, pSurface); + if(status != VK12.VK_SUCCESS) + { + throw new VulkanException("Failed to create vulkan surface for window reason: " + VkUtils.translateVulkanResult(status)); + } + + VkConstants.windowSurface = pSurface.get(0); + } + } +} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/io/VulkanException.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/io/VulkanException.java new file mode 100644 index 0000000..39b77c3 --- /dev/null +++ b/src/main/java/com/github/hydos/ginger/engine/vulkan/io/VulkanException.java @@ -0,0 +1,15 @@ +package com.github.hydos.ginger.engine.vulkan.io; + +public class VulkanException extends RuntimeException +{ + + public VulkanException(String string) + { + super(string); + } + + /** + * the exception type thrown when a vulkan error is thrown + */ + private static final long serialVersionUID = -6985060773180054456L; +} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/memory/VKMemory.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/memory/VKMemory.java deleted file mode 100644 index 4d1d0fd..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/memory/VKMemory.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.memory; - -import java.nio.IntBuffer; - -import org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties; - -public class VKMemory { - - public static boolean getMemoryType(VkPhysicalDeviceMemoryProperties deviceMemoryProperties, int typeBits, int properties, IntBuffer typeIndex) - { - int bits = typeBits; - for (int i = 0; i < 32; i++) - { - if ((bits & 1) == 1) - { - if ((deviceMemoryProperties.memoryTypes(i).propertyFlags() & properties) == properties) - { - typeIndex.put(0, i); - return true; - } - } - bits >>= 1; - } - return false; - } - - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKModelConverter.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKModelConverter.java deleted file mode 100644 index d3044c4..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKModelConverter.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.model; - -import static org.lwjgl.system.MemoryUtil.*; - -import java.nio.*; - -import org.lwjgl.PointerBuffer; -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.common.obj.Mesh; -import com.github.hydos.ginger.engine.vulkan.memory.VKMemory; -import com.github.hydos.ginger.engine.vulkan.utils.VKUtils; - -public class VKModelConverter -{ - - public static VKVertices convertModel(Mesh mesh, VkPhysicalDeviceMemoryProperties deviceMemoryProperties, VkDevice device) - { - ByteBuffer vertexBuffer = memAlloc(mesh.getVertices().length * 4); - FloatBuffer bufferVertices = vertexBuffer.asFloatBuffer(); - for(float vertex: mesh.getVertices()) { - bufferVertices.put(vertex); - } - VkMemoryAllocateInfo memAlloc = VkMemoryAllocateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); - VkMemoryRequirements memReqs = VkMemoryRequirements.calloc(); - int err; - // Generate vertex buffer - // Setup - VkBufferCreateInfo bufInfo = VkBufferCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO) - .size(vertexBuffer.remaining()) - .usage(VK12.VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); - LongBuffer pBuffer = memAllocLong(1); - err = VK12.vkCreateBuffer(device, bufInfo, null, pBuffer); - long verticesBuf = pBuffer.get(0); - memFree(pBuffer); - bufInfo.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create vertex buffer: " + VKUtils.translateVulkanResult(err)); } - VK12.vkGetBufferMemoryRequirements(device, verticesBuf, memReqs); - memAlloc.allocationSize(memReqs.size()); - IntBuffer memoryTypeIndex = memAllocInt(1); - VKMemory.getMemoryType(deviceMemoryProperties, memReqs.memoryTypeBits(), VK12.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, memoryTypeIndex); - memAlloc.memoryTypeIndex(memoryTypeIndex.get(0)); - memFree(memoryTypeIndex); - memReqs.free(); - LongBuffer pMemory = memAllocLong(1); - err = VK12.vkAllocateMemory(device, memAlloc, null, pMemory); - long verticesMem = pMemory.get(0); - memFree(pMemory); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to allocate vertex memory: " + VKUtils.translateVulkanResult(err)); } - PointerBuffer pData = memAllocPointer(1); - err = VK12.vkMapMemory(device, verticesMem, 0, vertexBuffer.remaining(), 0, pData); - memAlloc.free(); - long data = pData.get(0); - memFree(pData); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to map vertex memory: " + VKUtils.translateVulkanResult(err)); } - memCopy(memAddress(vertexBuffer), data, vertexBuffer.remaining()); - memFree(vertexBuffer); - VK12.vkUnmapMemory(device, verticesMem); - err = VK12.vkBindBufferMemory(device, verticesBuf, verticesMem, 0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to bind memory to vertex buffer: " + VKUtils.translateVulkanResult(err)); } - // Binding description - VkVertexInputBindingDescription.Buffer bindingDescriptor = VkVertexInputBindingDescription.calloc(1) - .binding(0) // <- we bind our vertex buffer to point 0 - .stride((3 + 3) * 4) - .inputRate(VK12.VK_VERTEX_INPUT_RATE_VERTEX); - // Attribute descriptions - // Describes memory layout and shader attribute locations - VkVertexInputAttributeDescription.Buffer attributeDescriptions = VkVertexInputAttributeDescription.calloc(2); - // Location 0 : Position - attributeDescriptions.get(0) - .binding(0) // <- binding point used in the VkVertexInputBindingDescription - .location(0) // <- location in the shader's attribute layout (inside the shader source) - .format(VK12.VK_FORMAT_R32G32B32_SFLOAT) - .offset(0); - // Location 1 : Color - attributeDescriptions.get(1) - .binding(0) // <- binding point used in the VkVertexInputBindingDescription - .location(1) // <- location in the shader's attribute layout (inside the shader source) - .format(VK12.VK_FORMAT_R32G32B32_SFLOAT) - .offset(3 * 4); - // Assign to vertex buffer - VkPipelineVertexInputStateCreateInfo vi = VkPipelineVertexInputStateCreateInfo.calloc(); - vi.sType(VK12.VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO); - vi.pVertexBindingDescriptions(bindingDescriptor); - vi.pVertexAttributeDescriptions(attributeDescriptions); - VKVertices ret = new VKVertices(); - ret.createInfo = vi; - ret.vkVerticiesBuffer = verticesBuf; - return ret; - } - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKModelData.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKModelData.java deleted file mode 100644 index dcfc1ef..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKModelData.java +++ /dev/null @@ -1,243 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.model; - -import static org.lwjgl.system.MemoryStack.stackPush; - -import java.nio.*; - -import org.lwjgl.PointerBuffer; -import org.lwjgl.system.MemoryStack; -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.common.obj.*; -import com.github.hydos.ginger.engine.vulkan.registers.VKRegister; - -public class VKModelData -{ - - public Mesh mesh; - public long vertexBuffer; - public long vertexBufferMemory; - public long indexBuffer; - public long indexBufferMemory; - - public void loadModel() { - this.mesh = ModelLoader.getCubeMesh(); - createVertexBuffer(); - createIndexBuffer(); - } - - public int findMemoryType(int typeFilter, int properties) { - - VkPhysicalDeviceMemoryProperties memProperties = VkPhysicalDeviceMemoryProperties.mallocStack(); - VK12.vkGetPhysicalDeviceMemoryProperties(VKRegister.physicalDevice, memProperties); - - for(int i = 0;i < memProperties.memoryTypeCount();i++) { - if((typeFilter & (1 << i)) != 0 && (memProperties.memoryTypes(i).propertyFlags() & properties) == properties) { - return i; - } - } - - throw new RuntimeException("Failed to find suitable memory type"); - } - - public void createBuffer(long size, int usage, int properties, LongBuffer pBuffer, LongBuffer pBufferMemory) { - - try(MemoryStack stack = stackPush()) { - - VkBufferCreateInfo bufferInfo = VkBufferCreateInfo.callocStack(stack); - bufferInfo.sType(VK12.VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO); - bufferInfo.size(size); - bufferInfo.usage(usage); - bufferInfo.sharingMode(VK12.VK_SHARING_MODE_EXCLUSIVE); - - if(VK12.vkCreateBuffer(VKRegister.device, bufferInfo, null, pBuffer) != VK12.VK_SUCCESS) { - throw new RuntimeException("Failed to create vertex buffer"); - } - - VkMemoryRequirements memRequirements = VkMemoryRequirements.mallocStack(stack); - VK12.vkGetBufferMemoryRequirements(VKRegister.device, pBuffer.get(0), memRequirements); - - VkMemoryAllocateInfo allocInfo = VkMemoryAllocateInfo.callocStack(stack); - allocInfo.sType(VK12.VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); - allocInfo.allocationSize(memRequirements.size()); - allocInfo.memoryTypeIndex(findMemoryType(memRequirements.memoryTypeBits(), properties)); - - if(VK12.vkAllocateMemory(VKRegister.device, allocInfo, null, pBufferMemory) != VK12.VK_SUCCESS) { - throw new RuntimeException("Failed to allocate vertex buffer memory"); - } - - VK12.vkBindBufferMemory(VKRegister.device, pBuffer.get(0), pBufferMemory.get(0), 0); - } - } - - private void endSingleTimeCommands(VkCommandBuffer commandBuffer) { - - try(MemoryStack stack = stackPush()) { - - VK12.vkEndCommandBuffer(commandBuffer); - - VkSubmitInfo.Buffer submitInfo = VkSubmitInfo.callocStack(1, stack); - submitInfo.sType(VK12.VK_STRUCTURE_TYPE_SUBMIT_INFO); - submitInfo.pCommandBuffers(stack.pointers(commandBuffer)); - - VK12.vkQueueSubmit(VKRegister.queue, submitInfo, VK12.VK_NULL_HANDLE); - VK12.vkQueueWaitIdle(VKRegister.queue); - - VK12.vkFreeCommandBuffers(VKRegister.device, VKRegister.commandPool, commandBuffer); - } - } - - private VkCommandBuffer beginSingleTimeCommands() { - - try(MemoryStack stack = stackPush()) { - - VkCommandBufferAllocateInfo allocInfo = VkCommandBufferAllocateInfo.callocStack(stack); - allocInfo.sType(VK12.VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO); - allocInfo.level(VK12.VK_COMMAND_BUFFER_LEVEL_PRIMARY); - allocInfo.commandPool(VKRegister.commandPool); - allocInfo.commandBufferCount(1); - - PointerBuffer pCommandBuffer = stack.mallocPointer(1); - VK12.vkAllocateCommandBuffers(VKRegister.device, allocInfo, pCommandBuffer); - VkCommandBuffer commandBuffer = new VkCommandBuffer(pCommandBuffer.get(0), VKRegister.device); - - VkCommandBufferBeginInfo beginInfo = VkCommandBufferBeginInfo.callocStack(stack); - beginInfo.sType(VK12.VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO); - beginInfo.flags(VK12.VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - - VK12.vkBeginCommandBuffer(commandBuffer, beginInfo); - - return commandBuffer; - } - } - - private void copyBuffer(long srcBuffer, long dstBuffer, long size) { - - try(MemoryStack stack = stackPush()) { - - VkCommandBuffer commandBuffer = beginSingleTimeCommands(); - - VkBufferCopy.Buffer copyRegion = VkBufferCopy.callocStack(1, stack); - copyRegion.size(size); - - VK12.vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, copyRegion); - - endSingleTimeCommands(commandBuffer); - } - } - - - private void memcpy(ByteBuffer buffer, float[] vertices) { - -// buffer.putFloat(vertex.color.x()); -// buffer.putFloat(vertex.color.y()); -// buffer.putFloat(vertex.color.z()); -// -// buffer.putFloat(vertex.texCoords.x()); -// buffer.putFloat(vertex.texCoords.y()); - int i = 0; - for(float vertex : vertices) { - buffer.putFloat(vertex); - if(i == 2) { - i = 0; - buffer.putFloat(1); - buffer.putFloat(1); - buffer.putFloat(1); - } - i++; - - } - } - - private void createVertexBuffer() { - - try(MemoryStack stack = stackPush()) { - - long bufferSize = ((3 + 3 + 2) * Float.BYTES) * mesh.getVertices().length; - - LongBuffer pBuffer = stack.mallocLong(1); - LongBuffer pBufferMemory = stack.mallocLong(1); - createBuffer(bufferSize, - VK12.VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK12.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK12.VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - pBuffer, - pBufferMemory); - - long stagingBuffer = pBuffer.get(0); - long stagingBufferMemory = pBufferMemory.get(0); - - PointerBuffer data = stack.mallocPointer(1); - - VK12.vkMapMemory(VKRegister.device, stagingBufferMemory, 0, bufferSize, 0, data); - { - memcpy(data.getByteBuffer(0, (int) bufferSize), mesh.getVertices()); - } - VK12.vkUnmapMemory(VKRegister.device, stagingBufferMemory); - - createBuffer(bufferSize, - VK12.VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK12.VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - VK12.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT, - pBuffer, - pBufferMemory); - - vertexBuffer = pBuffer.get(0); - vertexBufferMemory = pBufferMemory.get(0); - - copyBuffer(stagingBuffer, vertexBuffer, bufferSize); - - VK12.vkDestroyBuffer(VKRegister.device, stagingBuffer, null); - VK12.vkFreeMemory(VKRegister.device, stagingBufferMemory, null); - } - } - - private void memcpy(ByteBuffer buffer, int[] indices) { - - for(int index : indices) { - buffer.putInt(index); - } - - buffer.rewind(); - } - - private void createIndexBuffer() { - - try(MemoryStack stack = stackPush()) { - - long bufferSize = Integer.BYTES * mesh.getIndices().length; - - LongBuffer pBuffer = stack.mallocLong(1); - LongBuffer pBufferMemory = stack.mallocLong(1); - createBuffer(bufferSize, - VK12.VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK12.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK12.VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - pBuffer, - pBufferMemory); - - long stagingBuffer = pBuffer.get(0); - long stagingBufferMemory = pBufferMemory.get(0); - - PointerBuffer data = stack.mallocPointer(1); - - VK12.vkMapMemory(VKRegister.device, stagingBufferMemory, 0, bufferSize, 0, data); - { - memcpy(data.getByteBuffer(0, (int) bufferSize), mesh.getIndices()); - } - VK12.vkUnmapMemory(VKRegister.device, stagingBufferMemory); - - createBuffer(bufferSize, - VK12.VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK12.VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - VK12.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT, - pBuffer, - pBufferMemory); - - indexBuffer = pBuffer.get(0); - indexBufferMemory = pBufferMemory.get(0); - - copyBuffer(stagingBuffer, indexBuffer, bufferSize); - - VK12.vkDestroyBuffer(VKRegister.device, stagingBuffer, null); - VK12.vkFreeMemory(VKRegister.device, stagingBufferMemory, null); - } - } - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKVertices.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKVertices.java deleted file mode 100644 index 213895b..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/model/VKVertices.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.model; - -import org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo; - -public class VKVertices -{ - public long vkVerticiesBuffer; - public VkPipelineVertexInputStateCreateInfo createInfo; - public float[] commonVerticies; -} \ No newline at end of file diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/registers/VKRegister.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/registers/VKRegister.java deleted file mode 100644 index 43d3d92..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/registers/VKRegister.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.registers; - -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.vulkan.model.VKModelData; - -public class VKRegister -{ - - public static VkDevice device; - public static VkQueue queue; - public static long commandPool; - public static VkPhysicalDevice physicalDevice; - public static VKModelData exampleVKModel; - - - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/RenderUtils.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/render/RenderUtils.java deleted file mode 100644 index 3dd94b0..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/RenderUtils.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.render; - -import static org.lwjgl.system.MemoryUtil.memAddress; -import static org.lwjgl.system.MemoryUtil.memAlloc; -import static org.lwjgl.system.MemoryUtil.memAllocInt; -import static org.lwjgl.system.MemoryUtil.memAllocLong; -import static org.lwjgl.system.MemoryUtil.memAllocPointer; -import static org.lwjgl.system.MemoryUtil.memCopy; -import static org.lwjgl.system.MemoryUtil.memFree; -import static org.lwjgl.vulkan.KHRSwapchain.VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.nio.LongBuffer; - -import org.lwjgl.PointerBuffer; -import org.lwjgl.vulkan.VK12; -import org.lwjgl.vulkan.VkAttachmentDescription; -import org.lwjgl.vulkan.VkAttachmentReference; -import org.lwjgl.vulkan.VkBufferCreateInfo; -import org.lwjgl.vulkan.VkDevice; -import org.lwjgl.vulkan.VkFramebufferCreateInfo; -import org.lwjgl.vulkan.VkMemoryAllocateInfo; -import org.lwjgl.vulkan.VkMemoryRequirements; -import org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties; -import org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo; -import org.lwjgl.vulkan.VkRenderPassCreateInfo; -import org.lwjgl.vulkan.VkSubpassDescription; -import org.lwjgl.vulkan.VkVertexInputAttributeDescription; -import org.lwjgl.vulkan.VkVertexInputBindingDescription; - -import com.github.hydos.ginger.VulkanStarter.DepthStencil; -import com.github.hydos.ginger.VulkanStarter.Swapchain; -import com.github.hydos.ginger.engine.vulkan.memory.VKMemory; -import com.github.hydos.ginger.engine.vulkan.model.VKVertices; -import com.github.hydos.ginger.engine.vulkan.utils.VKUtils; - -public class RenderUtils -{ - - public static long createRenderPass(VkDevice device, int colorFormat, int depthFormat) - { - VkAttachmentDescription.Buffer attachments = VkAttachmentDescription.calloc(2); - attachments.get(0) // <- color attachment - .format(colorFormat) - .samples(VK12.VK_SAMPLE_COUNT_1_BIT) - .loadOp(VK12.VK_ATTACHMENT_LOAD_OP_CLEAR) - .storeOp(VK12.VK_ATTACHMENT_STORE_OP_STORE) - .stencilLoadOp(VK12.VK_ATTACHMENT_LOAD_OP_DONT_CARE) - .stencilStoreOp(VK12.VK_ATTACHMENT_STORE_OP_DONT_CARE) - .initialLayout(VK12.VK_IMAGE_LAYOUT_UNDEFINED) - .finalLayout(VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - attachments.get(1) // <- depth-stencil attachment - .format(depthFormat) - .samples(VK12.VK_SAMPLE_COUNT_1_BIT) - .loadOp(VK12.VK_ATTACHMENT_LOAD_OP_CLEAR) - .storeOp(VK12.VK_ATTACHMENT_STORE_OP_STORE) - .stencilLoadOp(VK12.VK_ATTACHMENT_LOAD_OP_DONT_CARE) - .stencilStoreOp(VK12.VK_ATTACHMENT_STORE_OP_DONT_CARE) - .initialLayout(VK12.VK_IMAGE_LAYOUT_UNDEFINED) - .finalLayout(VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - VkAttachmentReference.Buffer colorReference = VkAttachmentReference.calloc(1) - .attachment(0) - .layout(VK12.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - VkAttachmentReference depthReference = VkAttachmentReference.calloc() - .attachment(1) - .layout(VK12.VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - VkSubpassDescription.Buffer subpass = VkSubpassDescription.calloc(1) - .pipelineBindPoint(VK12.VK_PIPELINE_BIND_POINT_GRAPHICS) - .colorAttachmentCount(colorReference.remaining()) - .pColorAttachments(colorReference) // <- only color attachment - .pDepthStencilAttachment(depthReference) // <- and depth-stencil - ; - VkRenderPassCreateInfo renderPassInfo = VkRenderPassCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO) - .pAttachments(attachments) - .pSubpasses(subpass); - LongBuffer pRenderPass = memAllocLong(1); - int err = VK12.vkCreateRenderPass(device, renderPassInfo, null, pRenderPass); - long renderPass = pRenderPass.get(0); - memFree(pRenderPass); - renderPassInfo.free(); - depthReference.free(); - colorReference.free(); - subpass.free(); - attachments.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create clear render pass: " + VKUtils.translateVulkanResult(err)); } - return renderPass; - } - - public static long[] createFramebuffers(VkDevice device, Swapchain swapchain, long renderPass, int width, int height, DepthStencil depthStencil) - { - LongBuffer attachments = memAllocLong(2); - attachments.put(1, depthStencil.view); - VkFramebufferCreateInfo fci = VkFramebufferCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO) - .pAttachments(attachments) - .height(height) - .width(width) - .layers(1) - .renderPass(renderPass); - // Create a framebuffer for each swapchain image - long[] framebuffers = new long[swapchain.images.length]; - LongBuffer pFramebuffer = memAllocLong(1); - for (int i = 0; i < swapchain.images.length; i++) - { - attachments.put(0, swapchain.imageViews[i]); - int err = VK12.vkCreateFramebuffer(device, fci, null, pFramebuffer); - long framebuffer = pFramebuffer.get(0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create framebuffer: " + VKUtils.translateVulkanResult(err)); } - framebuffers[i] = framebuffer; - } - memFree(attachments); - memFree(pFramebuffer); - fci.free(); - return framebuffers; - } - - public static VKVertices createVertices(VkPhysicalDeviceMemoryProperties deviceMemoryProperties, VkDevice device) - { - ByteBuffer vertexBuffer = memAlloc(2 * 3 * (3 + 3) * 4); - FloatBuffer fb = vertexBuffer.asFloatBuffer(); - // first triangle - fb.put(-0.5f).put(-0.5f).put(0.5f).put(1.0f).put(0.0f).put(0.0f); - fb.put(0.5f).put(-0.5f).put(0.5f).put(0.0f).put(1.0f).put(0.0f); - fb.put(0.0f).put(0.5f).put(0.5f).put(0.0f).put(0.0f).put(1.0f); - // second triangle - fb.put(0.5f).put(-0.5f).put(-0.5f).put(1.0f).put(1.0f).put(0.0f); - fb.put(-0.5f).put(-0.5f).put(-0.5f).put(0.0f).put(1.0f).put(1.0f); - fb.put(0.0f).put(0.5f).put(-0.5f).put(1.0f).put(0.0f).put(1.0f); - VkMemoryAllocateInfo memAlloc = VkMemoryAllocateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); - VkMemoryRequirements memReqs = VkMemoryRequirements.calloc(); - int err; - // Generate vertex buffer - // Setup - VkBufferCreateInfo bufInfo = VkBufferCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO) - .size(vertexBuffer.remaining()) - .usage(VK12.VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); - LongBuffer pBuffer = memAllocLong(1); - err = VK12.vkCreateBuffer(device, bufInfo, null, pBuffer); - long verticesBuf = pBuffer.get(0); - memFree(pBuffer); - bufInfo.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create vertex buffer: " + VKUtils.translateVulkanResult(err)); } - VK12.vkGetBufferMemoryRequirements(device, verticesBuf, memReqs); - memAlloc.allocationSize(memReqs.size()); - IntBuffer memoryTypeIndex = memAllocInt(1); - VKMemory.getMemoryType(deviceMemoryProperties, memReqs.memoryTypeBits(), VK12.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, memoryTypeIndex); - memAlloc.memoryTypeIndex(memoryTypeIndex.get(0)); - memFree(memoryTypeIndex); - memReqs.free(); - LongBuffer pMemory = memAllocLong(1); - err = VK12.vkAllocateMemory(device, memAlloc, null, pMemory); - long verticesMem = pMemory.get(0); - memFree(pMemory); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to allocate vertex memory: " + VKUtils.translateVulkanResult(err)); } - PointerBuffer pData = memAllocPointer(1); - err = VK12.vkMapMemory(device, verticesMem, 0, vertexBuffer.remaining(), 0, pData); - memAlloc.free(); - long data = pData.get(0); - memFree(pData); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to map vertex memory: " + VKUtils.translateVulkanResult(err)); } - memCopy(memAddress(vertexBuffer), data, vertexBuffer.remaining()); - memFree(vertexBuffer); - VK12.vkUnmapMemory(device, verticesMem); - err = VK12.vkBindBufferMemory(device, verticesBuf, verticesMem, 0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to bind memory to vertex buffer: " + VKUtils.translateVulkanResult(err)); } - // Binding description - VkVertexInputBindingDescription.Buffer bindingDescriptor = VkVertexInputBindingDescription.calloc(1) - .binding(0) // <- we bind our vertex buffer to point 0 - .stride((3 + 3) * 4) - .inputRate(VK12.VK_VERTEX_INPUT_RATE_VERTEX); - // Attribute descriptions - // Describes memory layout and shader attribute locations - VkVertexInputAttributeDescription.Buffer attributeDescriptions = VkVertexInputAttributeDescription.calloc(2); - // Location 0 : Position - attributeDescriptions.get(0) - .binding(0) // <- binding point used in the VkVertexInputBindingDescription - .location(0) // <- location in the shader's attribute layout (inside the shader source) - .format(VK12.VK_FORMAT_R32G32B32_SFLOAT) - .offset(0); - // Location 1 : Color - attributeDescriptions.get(1) - .binding(0) // <- binding point used in the VkVertexInputBindingDescription - .location(1) // <- location in the shader's attribute layout (inside the shader source) - .format(VK12.VK_FORMAT_R32G32B32_SFLOAT) - .offset(3 * 4); - // Assign to vertex buffer - VkPipelineVertexInputStateCreateInfo vi = VkPipelineVertexInputStateCreateInfo.calloc(); - vi.sType(VK12.VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO); - vi.pVertexBindingDescriptions(bindingDescriptor); - vi.pVertexAttributeDescriptions(attributeDescriptions); - VKVertices ret = new VKVertices(); - ret.createInfo = vi; - ret.vkVerticiesBuffer = verticesBuf; - return ret; - } -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/EntityRenderer.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/EntityRenderer.java deleted file mode 100644 index d497c6c..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/EntityRenderer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.render.renderers; - -import static org.lwjgl.system.MemoryUtil.*; - -import java.nio.LongBuffer; - -import org.lwjgl.system.MemoryStack; -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.vulkan.registers.VKRegister; - -public class EntityRenderer extends VKRenderer -{ - - @Override - public void render(MemoryStack stack, VkCommandBuffer renderCommandBuffer) - { -// //Bind the models buffers -// LongBuffer offsets = memAllocLong(1); -// offsets.put(0, 0L); -// LongBuffer vertexBuffers = stack.longs(VKRegister.exampleVKModel.vertexBuffer); -// VK12.vkCmdBindVertexBuffers(renderCommandBuffer, 0, vertexBuffers, offsets); -// VK12.vkCmdBindIndexBuffer(renderCommandBuffer, VKRegister.exampleVKModel.indexBuffer, 0, 3);// 3 = VK_INDEX_TYPE_UINT32 -// memFree(offsets); -// -// //Render the texture -// VK12.vkCmdDrawIndexed(renderCommandBuffer, VKRegister.exampleVKModel.mesh.getIndices().length, 1, 0, 0, 0); -// FIXME: make master render get instance render with this instead, etc u get the point - } - - public static void tempStaticRender(MemoryStack stack, VkCommandBuffer renderCommandBuffer) - { - //Bind the models buffers - LongBuffer offsets = memAllocLong(1); - offsets.put(0, 0L); - LongBuffer vertexBuffers = stack.longs(VKRegister.exampleVKModel.vertexBuffer); - VK12.vkCmdBindVertexBuffers(renderCommandBuffer, 0, vertexBuffers, offsets); - VK12.vkCmdBindIndexBuffer(renderCommandBuffer, VKRegister.exampleVKModel.indexBuffer, 0, 0);// 3 = VK_INDEX_TYPE_UINT32 - memFree(offsets); - - //Render the texture - VK12.vkCmdDrawIndexed(renderCommandBuffer, VKRegister.exampleVKModel.mesh.getIndices().length, 1, 0, 0, 0); - } - - - - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/VKMasterRenderer.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/VKMasterRenderer.java deleted file mode 100644 index ca33d17..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/VKMasterRenderer.java +++ /dev/null @@ -1,324 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.render.renderers; - -import static org.lwjgl.system.MemoryUtil.memAllocInt; -import static org.lwjgl.system.MemoryUtil.memAllocLong; -import static org.lwjgl.system.MemoryUtil.memFree; -import static org.lwjgl.vulkan.KHRSurface.VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; -import static org.lwjgl.vulkan.KHRSurface.VK_PRESENT_MODE_FIFO_KHR; -import static org.lwjgl.vulkan.KHRSurface.VK_PRESENT_MODE_IMMEDIATE_KHR; -import static org.lwjgl.vulkan.KHRSurface.VK_PRESENT_MODE_MAILBOX_KHR; -import static org.lwjgl.vulkan.KHRSurface.VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; -import static org.lwjgl.vulkan.KHRSurface.vkGetPhysicalDeviceSurfaceCapabilitiesKHR; -import static org.lwjgl.vulkan.KHRSurface.vkGetPhysicalDeviceSurfaceFormatsKHR; -import static org.lwjgl.vulkan.KHRSurface.vkGetPhysicalDeviceSurfacePresentModesKHR; -import static org.lwjgl.vulkan.KHRSurface.vkGetPhysicalDeviceSurfaceSupportKHR; -import static org.lwjgl.vulkan.KHRSwapchain.VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; -import static org.lwjgl.vulkan.KHRSwapchain.vkCreateSwapchainKHR; -import static org.lwjgl.vulkan.KHRSwapchain.vkDestroySwapchainKHR; -import static org.lwjgl.vulkan.KHRSwapchain.vkGetSwapchainImagesKHR; - -import java.nio.IntBuffer; -import java.nio.LongBuffer; - -import org.lwjgl.vulkan.VK12; -import org.lwjgl.vulkan.VkCommandBuffer; -import org.lwjgl.vulkan.VkDevice; -import org.lwjgl.vulkan.VkExtent2D; -import org.lwjgl.vulkan.VkImageCreateInfo; -import org.lwjgl.vulkan.VkImageViewCreateInfo; -import org.lwjgl.vulkan.VkMemoryAllocateInfo; -import org.lwjgl.vulkan.VkMemoryRequirements; -import org.lwjgl.vulkan.VkPhysicalDevice; -import org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties; -import org.lwjgl.vulkan.VkQueueFamilyProperties; -import org.lwjgl.vulkan.VkSurfaceCapabilitiesKHR; -import org.lwjgl.vulkan.VkSurfaceFormatKHR; -import org.lwjgl.vulkan.VkSwapchainCreateInfoKHR; - -import com.github.hydos.ginger.VulkanStarter; -import com.github.hydos.ginger.VulkanStarter.ColorAndDepthFormatAndSpace; -import com.github.hydos.ginger.VulkanStarter.DepthStencil; -import com.github.hydos.ginger.VulkanStarter.Swapchain; -import com.github.hydos.ginger.engine.common.io.Window; -import com.github.hydos.ginger.engine.vulkan.memory.VKMemory; -import com.github.hydos.ginger.engine.vulkan.utils.VKUtils; - -public class VKMasterRenderer -{ - - public static ColorAndDepthFormatAndSpace getColorFormatAndSpace(VkPhysicalDevice physicalDevice, long surface) - { - IntBuffer pQueueFamilyPropertyCount = memAllocInt(1); - VK12.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, null); - int queueCount = pQueueFamilyPropertyCount.get(0); - VkQueueFamilyProperties.Buffer queueProps = VkQueueFamilyProperties.calloc(queueCount); - VK12.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, queueProps); - memFree(pQueueFamilyPropertyCount); - // Iterate over each queue to learn whether it supports presenting: - IntBuffer supportsPresent = memAllocInt(queueCount); - for (int i = 0; i < queueCount; i++) - { - supportsPresent.position(i); - int err = vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, i, surface, supportsPresent); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to physical device surface support: " + VKUtils.translateVulkanResult(err)); } - } - // Search for a graphics and a present queue in the array of queue families, try to find one that supports both - int graphicsQueueNodeIndex = Integer.MAX_VALUE; - int presentQueueNodeIndex = Integer.MAX_VALUE; - for (int i = 0; i < queueCount; i++) - { - if ((queueProps.get(i).queueFlags() & VK12.VK_QUEUE_GRAPHICS_BIT) != 0) - { - if (graphicsQueueNodeIndex == Integer.MAX_VALUE) - { graphicsQueueNodeIndex = i; } - if (supportsPresent.get(i) == VK12.VK_TRUE) - { - graphicsQueueNodeIndex = i; - presentQueueNodeIndex = i; - break; - } - } - } - queueProps.free(); - if (presentQueueNodeIndex == Integer.MAX_VALUE) - { - // If there's no queue that supports both present and graphics try to find a separate present queue - for (int i = 0; i < queueCount; ++i) - { - if (supportsPresent.get(i) == VK12.VK_TRUE) - { - presentQueueNodeIndex = i; - break; - } - } - } - memFree(supportsPresent); - // Generate error if could not find both a graphics and a present queue - if (graphicsQueueNodeIndex == Integer.MAX_VALUE) - { throw new AssertionError("No graphics queue found"); } - if (presentQueueNodeIndex == Integer.MAX_VALUE) - { throw new AssertionError("No presentation queue found"); } - if (graphicsQueueNodeIndex != presentQueueNodeIndex) - { throw new AssertionError("Presentation queue != graphics queue"); } - // Get list of supported formats - IntBuffer pFormatCount = memAllocInt(1); - int err = vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pFormatCount, null); - int formatCount = pFormatCount.get(0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to query number of physical device surface formats: " + VKUtils.translateVulkanResult(err)); } - VkSurfaceFormatKHR.Buffer surfFormats = VkSurfaceFormatKHR.calloc(formatCount); - err = vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pFormatCount, surfFormats); - memFree(pFormatCount); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to query physical device surface formats: " + VKUtils.translateVulkanResult(err)); } - int colorFormat; - if (formatCount == 1 && surfFormats.get(0).format() == VK12.VK_FORMAT_UNDEFINED) - { - colorFormat = VK12.VK_FORMAT_B8G8R8A8_UNORM; - } - else - { - colorFormat = surfFormats.get(0).format(); - } - int colorSpace = surfFormats.get(0).colorSpace(); - surfFormats.free(); - // Find suitable depth format - IntBuffer pDepthFormat = memAllocInt(1).put(0, -1); - VulkanStarter.getSupportedDepthFormat(physicalDevice, pDepthFormat); - int depthFormat = pDepthFormat.get(0); - ColorAndDepthFormatAndSpace ret = new ColorAndDepthFormatAndSpace(); - ret.colorFormat = colorFormat; - ret.colorSpace = colorSpace; - ret.depthFormat = depthFormat; - return ret; - } - - public static DepthStencil createDepthStencil(VkDevice device, VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties, int depthFormat, VkCommandBuffer setupCmdBuffer) - { - VkImageCreateInfo imageCreateInfo = VkImageCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO) - .imageType(VK12.VK_IMAGE_TYPE_2D) - .format(depthFormat) - .mipLevels(1) - .arrayLayers(1) - .samples(VK12.VK_SAMPLE_COUNT_1_BIT) - .tiling(VK12.VK_IMAGE_TILING_OPTIMAL) - .usage(VK12.VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK12.VK_IMAGE_USAGE_TRANSFER_SRC_BIT); - imageCreateInfo.extent().width(Window.getWidth()).height(Window.getHeight()).depth(1); - VkMemoryAllocateInfo mem_alloc = VkMemoryAllocateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); - VkImageViewCreateInfo depthStencilViewCreateInfo = VkImageViewCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO) - .viewType(VK12.VK_IMAGE_VIEW_TYPE_2D) - .format(depthFormat); - depthStencilViewCreateInfo.subresourceRange() - .aspectMask(VK12.VK_IMAGE_ASPECT_DEPTH_BIT | VK12.VK_IMAGE_ASPECT_STENCIL_BIT) - .levelCount(1) - .layerCount(1); - VkMemoryRequirements memReqs = VkMemoryRequirements.calloc(); - int err; - LongBuffer pDepthStencilImage = memAllocLong(1); - err = VK12.vkCreateImage(device, imageCreateInfo, null, pDepthStencilImage); - long depthStencilImage = pDepthStencilImage.get(0); - memFree(pDepthStencilImage); - imageCreateInfo.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create depth-stencil image: " + VKUtils.translateVulkanResult(err)); } - VK12.vkGetImageMemoryRequirements(device, depthStencilImage, memReqs); - mem_alloc.allocationSize(memReqs.size()); - IntBuffer pMemoryTypeIndex = memAllocInt(1); - VKMemory.getMemoryType(physicalDeviceMemoryProperties, memReqs.memoryTypeBits(), VK12.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, pMemoryTypeIndex); - mem_alloc.memoryTypeIndex(pMemoryTypeIndex.get(0)); - memFree(pMemoryTypeIndex); - LongBuffer pDepthStencilMem = memAllocLong(1); - err = VK12.vkAllocateMemory(device, mem_alloc, null, pDepthStencilMem); - long depthStencilMem = pDepthStencilMem.get(0); - memFree(pDepthStencilMem); - mem_alloc.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create depth-stencil memory: " + VKUtils.translateVulkanResult(err)); } - err = VK12.vkBindImageMemory(device, depthStencilImage, depthStencilMem, 0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to bind depth-stencil image to memory: " + VKUtils.translateVulkanResult(err)); } - depthStencilViewCreateInfo.image(depthStencilImage); - LongBuffer pDepthStencilView = memAllocLong(1); - err = VK12.vkCreateImageView(device, depthStencilViewCreateInfo, null, pDepthStencilView); - long depthStencilView = pDepthStencilView.get(0); - memFree(pDepthStencilView); - depthStencilViewCreateInfo.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create depth-stencil image view: " + VKUtils.translateVulkanResult(err)); } - DepthStencil ret = new DepthStencil(); - ret.view = depthStencilView; - return ret; - } - - public static Swapchain createSwapChain(VkDevice device, VkPhysicalDevice physicalDevice, long surface, long oldSwapChain, VkCommandBuffer commandBuffer, int newWidth, - int newHeight, int colorFormat, int colorSpace) - { - int err; - // Get physical device surface properties and formats - VkSurfaceCapabilitiesKHR surfCaps = VkSurfaceCapabilitiesKHR.calloc(); - err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, surfCaps); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to get physical device surface capabilities: " + VKUtils.translateVulkanResult(err)); } - IntBuffer pPresentModeCount = memAllocInt(1); - err = vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, null); - int presentModeCount = pPresentModeCount.get(0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to get number of physical device surface presentation modes: " + VKUtils.translateVulkanResult(err)); } - IntBuffer pPresentModes = memAllocInt(presentModeCount); - err = vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes); - memFree(pPresentModeCount); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to get physical device surface presentation modes: " + VKUtils.translateVulkanResult(err)); } - // Try to use mailbox mode. Low latency and non-tearing - int swapchainPresentMode = VK_PRESENT_MODE_FIFO_KHR; - for (int i = 0; i < presentModeCount; i++) - { - if (pPresentModes.get(i) == VK_PRESENT_MODE_MAILBOX_KHR) - { - swapchainPresentMode = VK_PRESENT_MODE_MAILBOX_KHR; - break; - } - if ((swapchainPresentMode != VK_PRESENT_MODE_MAILBOX_KHR) && (pPresentModes.get(i) == VK_PRESENT_MODE_IMMEDIATE_KHR)) - { swapchainPresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; } - } - memFree(pPresentModes); - // Determine the number of images - int desiredNumberOfSwapchainImages = surfCaps.minImageCount() + 1; - if ((surfCaps.maxImageCount() > 0) && (desiredNumberOfSwapchainImages > surfCaps.maxImageCount())) - { desiredNumberOfSwapchainImages = surfCaps.maxImageCount(); } - VkExtent2D currentExtent = surfCaps.currentExtent(); - int currentWidth = currentExtent.width(); - int currentHeight = currentExtent.height(); - if (currentWidth != -1 && currentHeight != -1) - { - Window.width = currentWidth; - Window.height = currentHeight; - } - else - { - Window.width = newWidth; - Window.height = newHeight; - } - int preTransform; - if ((surfCaps.supportedTransforms() & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) != 0) - { - preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; - } - else - { - preTransform = surfCaps.currentTransform(); - } - surfCaps.free(); - VkSwapchainCreateInfoKHR swapchainCI = VkSwapchainCreateInfoKHR.calloc() - .sType(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR) - .surface(surface) - .minImageCount(desiredNumberOfSwapchainImages) - .imageFormat(colorFormat) - .imageColorSpace(colorSpace) - .imageUsage(VK12.VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) - .preTransform(preTransform) - .imageArrayLayers(1) - .imageSharingMode(VK12.VK_SHARING_MODE_EXCLUSIVE) - .presentMode(swapchainPresentMode) - .oldSwapchain(oldSwapChain) - .clipped(true) - .compositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR); - swapchainCI.imageExtent() - .width(Window.getWidth()) - .height(Window.getHeight()); - LongBuffer pSwapChain = memAllocLong(1); - err = vkCreateSwapchainKHR(device, swapchainCI, null, pSwapChain); - swapchainCI.free(); - long swapChain = pSwapChain.get(0); - memFree(pSwapChain); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create swap chain: " + VKUtils.translateVulkanResult(err)); } - // If we just re-created an existing swapchain, we should destroy the old swapchain at this point. - // Note: destroying the swapchain also cleans up all its associated presentable images once the platform is done with them. - if (oldSwapChain != VK12.VK_NULL_HANDLE) - { vkDestroySwapchainKHR(device, oldSwapChain, null); } - IntBuffer pImageCount = memAllocInt(1); - err = vkGetSwapchainImagesKHR(device, swapChain, pImageCount, null); - int imageCount = pImageCount.get(0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to get number of swapchain images: " + VKUtils.translateVulkanResult(err)); } - LongBuffer pSwapchainImages = memAllocLong(imageCount); - err = vkGetSwapchainImagesKHR(device, swapChain, pImageCount, pSwapchainImages); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to get swapchain images: " + VKUtils.translateVulkanResult(err)); } - memFree(pImageCount); - long[] images = new long[imageCount]; - long[] imageViews = new long[imageCount]; - LongBuffer pBufferView = memAllocLong(1); - VkImageViewCreateInfo colorAttachmentView = VkImageViewCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO) - .format(colorFormat) - .viewType(VK12.VK_IMAGE_VIEW_TYPE_2D); - colorAttachmentView.subresourceRange() - .aspectMask(VK12.VK_IMAGE_ASPECT_COLOR_BIT) - .levelCount(1) - .layerCount(1); - for (int i = 0; i < imageCount; i++) - { - images[i] = pSwapchainImages.get(i); - colorAttachmentView.image(images[i]); - err = VK12.vkCreateImageView(device, colorAttachmentView, null, pBufferView); - imageViews[i] = pBufferView.get(0); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create image view: " + VKUtils.translateVulkanResult(err)); } - } - colorAttachmentView.free(); - memFree(pBufferView); - memFree(pSwapchainImages); - Swapchain ret = new Swapchain(); - ret.images = images; - ret.imageViews = imageViews; - ret.swapchainHandle = swapChain; - return ret; - } - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/VKRenderer.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/VKRenderer.java deleted file mode 100644 index 9ce27c4..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/renderers/VKRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.render.renderers; - -import org.lwjgl.system.MemoryStack; -import org.lwjgl.vulkan.VkCommandBuffer; - -public abstract class VKRenderer -{ - - public abstract void render(MemoryStack stack, VkCommandBuffer renderCommandBuffer); - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/ubo/Ubo.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/render/ubo/Ubo.java deleted file mode 100644 index fe34629..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/ubo/Ubo.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.render.ubo; - -import static org.lwjgl.system.MemoryUtil.*; -import static org.lwjgl.vulkan.VK10.*; - -import java.nio.*; - -import org.joml.Matrix4f; -import org.lwjgl.PointerBuffer; -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.common.io.Window; -import com.github.hydos.ginger.engine.vulkan.memory.VKMemory; -import com.github.hydos.ginger.engine.vulkan.utils.VKUtils; -/** - * A UBO is a uniform buffer object - * i believe its used to give data from code to the shaders - * @author hydos - * - */ -public class Ubo { - - public UboDescriptor uboData; - - public Ubo(VkPhysicalDeviceMemoryProperties deviceMemoryProperties, VkDevice device) - { - int err; - // Create a new buffer - VkBufferCreateInfo bufferInfo = VkBufferCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO) - .size(16 * 4) - .usage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); - LongBuffer pUniformDataVSBuffer = memAllocLong(1); - err = vkCreateBuffer(device, bufferInfo, null, pUniformDataVSBuffer); - long uniformDataVSBuffer = pUniformDataVSBuffer.get(0); - memFree(pUniformDataVSBuffer); - bufferInfo.free(); - if (err != VK_SUCCESS) - { throw new AssertionError("Failed to create UBO buffer: " + VKUtils.translateVulkanResult(err)); } - // Get memory requirements including size, alignment and memory type - VkMemoryRequirements memReqs = VkMemoryRequirements.calloc(); - vkGetBufferMemoryRequirements(device, uniformDataVSBuffer, memReqs); - long memSize = memReqs.size(); - int memoryTypeBits = memReqs.memoryTypeBits(); - memReqs.free(); - // Gets the appropriate memory type for this type of buffer allocation - // Only memory types that are visible to the host - IntBuffer pMemoryTypeIndex = memAllocInt(1); - VKMemory.getMemoryType(deviceMemoryProperties, memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, pMemoryTypeIndex); - int memoryTypeIndex = pMemoryTypeIndex.get(0); - memFree(pMemoryTypeIndex); - // Allocate memory for the uniform buffer - LongBuffer pUniformDataVSMemory = memAllocLong(1); - VkMemoryAllocateInfo allocInfo = VkMemoryAllocateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO) - .allocationSize(memSize) - .memoryTypeIndex(memoryTypeIndex); - err = vkAllocateMemory(device, allocInfo, null, pUniformDataVSMemory); - long uniformDataVSMemory = pUniformDataVSMemory.get(0); - memFree(pUniformDataVSMemory); - allocInfo.free(); - if (err != VK_SUCCESS) - { throw new AssertionError("Failed to allocate UBO memory: " + VKUtils.translateVulkanResult(err)); } - // Bind memory to buffer - err = vkBindBufferMemory(device, uniformDataVSBuffer, uniformDataVSMemory, 0); - if (err != VK_SUCCESS) - { throw new AssertionError("Failed to bind UBO memory: " + VKUtils.translateVulkanResult(err)); } - UboDescriptor ret = new UboDescriptor(); - ret.memory = uniformDataVSMemory; - ret.buffer = uniformDataVSBuffer; - ret.offset = 0L; - ret.range = 16 * 4; - this.uboData = ret; - } - - public void updateUbo(VkDevice device, float angle) - { - Matrix4f m = new Matrix4f() - .scale(1, -1, 1) // <- correcting viewport transformation (what Direct3D does, too) - .perspective((float) Math.toRadians(45.0f), (float) Window.getWidth() / Window.getHeight(), 0.1f, 10.0f, true) - .lookAt(0, 1, 3, - 0, 0, 0, - 0, 1, 0) - .rotateY(angle); - PointerBuffer pData = memAllocPointer(1); - int err = vkMapMemory(device, uboData.memory, 0, 16 * 4, 0, pData); - long data = pData.get(0); - memFree(pData); - if (err != VK_SUCCESS) - { throw new AssertionError("Failed to map UBO memory: " + VKUtils.translateVulkanResult(err)); } - ByteBuffer matrixBuffer = memByteBuffer(data, 16 * 4); - m.get(matrixBuffer); - vkUnmapMemory(device, uboData.memory); - } - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/ubo/UboDescriptor.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/render/ubo/UboDescriptor.java deleted file mode 100644 index 83f0ee0..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/render/ubo/UboDescriptor.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.render.ubo; - -public class UboDescriptor -{ - public long memory; //Memory location - public long buffer; //the Buffer? - public long offset; //some offset from the memory location - public long range; // the size -} \ No newline at end of file diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/Pipeline.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/Pipeline.java deleted file mode 100644 index 4a424d7..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/Pipeline.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.shaders; - -import static org.lwjgl.system.MemoryUtil.*; -import static org.lwjgl.vulkan.VK10.*; - -import java.io.IOException; -import java.nio.*; - -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.vulkan.utils.VKUtils; - -public class Pipeline -{ - public long pipeline; - public long layout; - - public static Pipeline createPipeline(VkDevice device, long renderPass, VkPipelineVertexInputStateCreateInfo vi, long descriptorSetLayout) throws IOException - { - int err; - // Vertex input state - // Describes the topoloy used with this pipeline - VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = VkPipelineInputAssemblyStateCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO) - .topology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST); - // Rasterization state - VkPipelineRasterizationStateCreateInfo rasterizationState = VkPipelineRasterizationStateCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO) - .polygonMode(VK_POLYGON_MODE_FILL) - .cullMode(VK_CULL_MODE_NONE) // <- VK_CULL_MODE_BACK_BIT would work here, too! - .frontFace(VK_FRONT_FACE_COUNTER_CLOCKWISE) - .lineWidth(1.0f); - // Color blend state - // Describes blend modes and color masks - VkPipelineColorBlendAttachmentState.Buffer colorWriteMask = VkPipelineColorBlendAttachmentState.calloc(1) - .colorWriteMask(0xF); // <- RGBA - VkPipelineColorBlendStateCreateInfo colorBlendState = VkPipelineColorBlendStateCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) - .pAttachments(colorWriteMask); - // Viewport state - VkPipelineViewportStateCreateInfo viewportState = VkPipelineViewportStateCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) - .viewportCount(1) // <- one viewport - .scissorCount(1); // <- one scissor rectangle - // Enable dynamic states - // Describes the dynamic states to be used with this pipeline - // Dynamic states can be set even after the pipeline has been created - // So there is no need to create new pipelines just for changing - // a viewport's dimensions or a scissor box - IntBuffer pDynamicStates = memAllocInt(2); - pDynamicStates.put(VK_DYNAMIC_STATE_VIEWPORT).put(VK_DYNAMIC_STATE_SCISSOR).flip(); - VkPipelineDynamicStateCreateInfo dynamicState = VkPipelineDynamicStateCreateInfo.calloc() - // The dynamic state properties themselves are stored in the command buffer - .sType(VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO) - .pDynamicStates(pDynamicStates); - // Depth and stencil state - // Describes depth and stenctil test and compare ops - VkPipelineDepthStencilStateCreateInfo depthStencilState = VkPipelineDepthStencilStateCreateInfo.calloc() - // No depth test/write and no stencil used - .sType(VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) - .depthTestEnable(true) - .depthWriteEnable(true) - .depthCompareOp(VK_COMPARE_OP_LESS_OR_EQUAL); - depthStencilState.back() - .failOp(VK_STENCIL_OP_KEEP) - .passOp(VK_STENCIL_OP_KEEP) - .compareOp(VK_COMPARE_OP_ALWAYS); - depthStencilState.front(depthStencilState.back()); - // Multi sampling state - // No multi sampling used in this example - VkPipelineMultisampleStateCreateInfo multisampleState = VkPipelineMultisampleStateCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) - .rasterizationSamples(VK_SAMPLE_COUNT_1_BIT); - // Load shaders - VkPipelineShaderStageCreateInfo.Buffer shaderStages = VkPipelineShaderStageCreateInfo.calloc(2); - shaderStages.get(0).set(VKShaderManager.loadShader(device, "/vulkan/shaders/entityVertexShader.glsl", VK_SHADER_STAGE_VERTEX_BIT)); - shaderStages.get(1).set(VKShaderManager.loadShader(device, "/vulkan/shaders/entityFragmentShader.glsl", VK_SHADER_STAGE_FRAGMENT_BIT)); - // Create the pipeline layout that is used to generate the rendering pipelines that - // are based on this descriptor set layout - LongBuffer pDescriptorSetLayout = memAllocLong(1).put(0, descriptorSetLayout); - VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = VkPipelineLayoutCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO) - .pSetLayouts(pDescriptorSetLayout); - LongBuffer pPipelineLayout = memAllocLong(1); - err = vkCreatePipelineLayout(device, pipelineLayoutCreateInfo, null, pPipelineLayout); - long layout = pPipelineLayout.get(0); - memFree(pPipelineLayout); - pipelineLayoutCreateInfo.free(); - memFree(pDescriptorSetLayout); - if (err != VK_SUCCESS) - { throw new AssertionError("Failed to create pipeline layout: " + VKUtils.translateVulkanResult(err)); } - // Assign states - VkGraphicsPipelineCreateInfo.Buffer pipelineCreateInfo = VkGraphicsPipelineCreateInfo.calloc(1) - .sType(VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO) - .layout(layout) // <- the layout used for this pipeline (NEEDS TO BE SET! even though it is basically empty) - .renderPass(renderPass) // <- renderpass this pipeline is attached to - .pVertexInputState(vi) - .pInputAssemblyState(inputAssemblyState) - .pRasterizationState(rasterizationState) - .pColorBlendState(colorBlendState) - .pMultisampleState(multisampleState) - .pViewportState(viewportState) - .pDepthStencilState(depthStencilState) - .pStages(shaderStages) - .pDynamicState(dynamicState); - // Create rendering pipeline - LongBuffer pPipelines = memAllocLong(1); - err = vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, pipelineCreateInfo, null, pPipelines); - long pipeline = pPipelines.get(0); - shaderStages.free(); - multisampleState.free(); - depthStencilState.free(); - dynamicState.free(); - memFree(pDynamicStates); - viewportState.free(); - colorBlendState.free(); - colorWriteMask.free(); - rasterizationState.free(); - inputAssemblyState.free(); - if (err != VK_SUCCESS) - { throw new AssertionError("Failed to create pipeline: " + VKUtils.translateVulkanResult(err)); } - com.github.hydos.ginger.engine.vulkan.shaders.Pipeline ret = new com.github.hydos.ginger.engine.vulkan.shaders.Pipeline(); - ret.layout = layout; - ret.pipeline = pipeline; - return ret; - } -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/ShaderType.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/ShaderType.java deleted file mode 100644 index 32daf94..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/ShaderType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.shaders; - -public class ShaderType -{ - public final static int vertexShader = 0; - -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/VKShaderManager.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/VKShaderManager.java deleted file mode 100644 index 8e6a74f..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/shaders/VKShaderManager.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.shaders; - -import static org.lwjgl.system.MemoryUtil.*; -import static org.lwjgl.vulkan.VK10.*; - -import java.io.IOException; -import java.nio.*; - -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.vulkan.utils.VKUtils; - -public class VKShaderManager { - - public static VkPipelineShaderStageCreateInfo loadShader(VkDevice device, String classPath, int stage) throws IOException - { - VkPipelineShaderStageCreateInfo shaderStage = VkPipelineShaderStageCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO) - .stage(stage) - .module(VKShaderManager.loadShader(classPath, device, stage)) - .pName(memUTF8("main")); - return shaderStage; - } - - public static long loadShader(String classPath, VkDevice device, int stage) throws IOException - { - ByteBuffer shaderCode = VKUtils.glslToSpirv(classPath, stage); - int err; - VkShaderModuleCreateInfo moduleCreateInfo = VkShaderModuleCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) - .pCode(shaderCode); - LongBuffer pShaderModule = memAllocLong(1); - err = vkCreateShaderModule(device, moduleCreateInfo, null, pShaderModule); - long shaderModule = pShaderModule.get(0); - memFree(pShaderModule); - if (err != VK_SUCCESS) - { throw new AssertionError("Failed to create shader module: " + VKUtils.translateVulkanResult(err)); } - return shaderModule; - } -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKBufferUtils.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKBufferUtils.java deleted file mode 100644 index e01b422..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKBufferUtils.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.utils; - -public class VKBufferUtils -{ -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKDeviceProperties.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKDeviceProperties.java deleted file mode 100644 index 0c50ae1..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKDeviceProperties.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.utils; - -import static org.lwjgl.system.MemoryUtil.*; -import static org.lwjgl.vulkan.KHRSwapchain.VK_KHR_SWAPCHAIN_EXTENSION_NAME; - -import java.nio.*; - -import org.lwjgl.PointerBuffer; -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.vulkan.VKConstants; - -public class VKDeviceProperties { - public VkDevice device; - public int queueFamilyIndex; - public VkPhysicalDeviceMemoryProperties memoryProperties; - - public static VkPhysicalDevice getFirstPhysicalDevice(VkInstance instance) - { - IntBuffer pPhysicalDeviceCount = memAllocInt(1); - int err = VK12.vkEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, null); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to get number of physical devices: " + VKUtils.translateVulkanResult(err)); } - PointerBuffer pPhysicalDevices = memAllocPointer(pPhysicalDeviceCount.get(0)); - err = VK12.vkEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices); - long physicalDevice = pPhysicalDevices.get(0); - memFree(pPhysicalDeviceCount); - memFree(pPhysicalDevices); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to get physical devices: " + VKUtils.translateVulkanResult(err)); } - return new VkPhysicalDevice(physicalDevice, instance); - } - - public static VKDeviceProperties initDeviceProperties(VkPhysicalDevice physicalDevice) - { - IntBuffer pQueueFamilyPropertyCount = memAllocInt(1); - VK12.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, null); - int queueCount = pQueueFamilyPropertyCount.get(0); - VkQueueFamilyProperties.Buffer queueProps = VkQueueFamilyProperties.calloc(queueCount); - VK12.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, queueProps); - memFree(pQueueFamilyPropertyCount); - int graphicsQueueFamilyIndex; - for (graphicsQueueFamilyIndex = 0; graphicsQueueFamilyIndex < queueCount; graphicsQueueFamilyIndex++) - { if ((queueProps.get(graphicsQueueFamilyIndex).queueFlags() & VK12.VK_QUEUE_GRAPHICS_BIT) != 0) - break; } - queueProps.free(); - FloatBuffer pQueuePriorities = memAllocFloat(1).put(0.0f); - pQueuePriorities.flip(); - VkDeviceQueueCreateInfo.Buffer queueCreateInfo = VkDeviceQueueCreateInfo.calloc(1) - .sType(VK12.VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO) - .queueFamilyIndex(graphicsQueueFamilyIndex) - .pQueuePriorities(pQueuePriorities); - PointerBuffer extensions = memAllocPointer(1); - ByteBuffer VK_KHR_SWAPCHAIN_EXTENSION = memUTF8(VK_KHR_SWAPCHAIN_EXTENSION_NAME); - extensions.put(VK_KHR_SWAPCHAIN_EXTENSION); - extensions.flip(); - PointerBuffer ppEnabledLayerNames = memAllocPointer(VKConstants.layers.length); - for (int i = 0; VKConstants.debug && i < VKConstants.layers.length; i++) - ppEnabledLayerNames.put(VKConstants.layers[i]); - ppEnabledLayerNames.flip(); - VkDeviceCreateInfo deviceCreateInfo = VkDeviceCreateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO) - .pQueueCreateInfos(queueCreateInfo) - .ppEnabledExtensionNames(extensions) - .ppEnabledLayerNames(ppEnabledLayerNames); - PointerBuffer pDevice = memAllocPointer(1); - int err = VK12.vkCreateDevice(physicalDevice, deviceCreateInfo, null, pDevice); - long device = pDevice.get(0); - memFree(pDevice); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create device: " + VKUtils.translateVulkanResult(err)); } - VkPhysicalDeviceMemoryProperties memoryProperties = VkPhysicalDeviceMemoryProperties.calloc(); - VK12.vkGetPhysicalDeviceMemoryProperties(physicalDevice, memoryProperties); - VKDeviceProperties ret = new VKDeviceProperties(); - ret.device = new VkDevice(device, physicalDevice, deviceCreateInfo); - ret.queueFamilyIndex = graphicsQueueFamilyIndex; - ret.memoryProperties = memoryProperties; - deviceCreateInfo.free(); - memFree(ppEnabledLayerNames); - memFree(VK_KHR_SWAPCHAIN_EXTENSION); - memFree(extensions); - memFree(pQueuePriorities); - return ret; - } -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKLoader.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKLoader.java deleted file mode 100644 index 58c3e64..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKLoader.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.utils; - -import static org.lwjgl.system.MemoryUtil.*; -import static org.lwjgl.vulkan.EXTDebugReport.VK_EXT_DEBUG_REPORT_EXTENSION_NAME; -import static org.lwjgl.vulkan.VK10.*; -import static org.lwjgl.vulkan.VK12.VK_API_VERSION_1_2; - -import java.nio.ByteBuffer; - -import org.lwjgl.PointerBuffer; -import org.lwjgl.vulkan.*; - -import com.github.hydos.ginger.engine.vulkan.VKConstants; - -/** @author hydos - * used to load vulkan related objects such as textures */ -public class VKLoader -{ - public static VkInstance createInstance(PointerBuffer requiredExtensions) { - VkApplicationInfo appInfo = VkApplicationInfo.calloc() - .sType(VK_STRUCTURE_TYPE_APPLICATION_INFO) - .apiVersion(VK_API_VERSION_1_2); - PointerBuffer ppEnabledExtensionNames = memAllocPointer(requiredExtensions.remaining() + 1); - ppEnabledExtensionNames.put(requiredExtensions); - ByteBuffer VK_EXT_DEBUG_REPORT_EXTENSION = memUTF8(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); - ppEnabledExtensionNames.put(VK_EXT_DEBUG_REPORT_EXTENSION); - ppEnabledExtensionNames.flip(); - PointerBuffer ppEnabledLayerNames = memAllocPointer(VKConstants.layers.length); - for (int i = 0; VKConstants.debug && i < VKConstants.layers.length; i++) - ppEnabledLayerNames.put(VKConstants.layers[i]); - ppEnabledLayerNames.flip(); - VkInstanceCreateInfo pCreateInfo = VkInstanceCreateInfo.calloc() - .sType(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO) - .pApplicationInfo(appInfo) - .ppEnabledExtensionNames(ppEnabledExtensionNames) - .ppEnabledLayerNames(ppEnabledLayerNames); - PointerBuffer pInstance = memAllocPointer(1); - int err = vkCreateInstance(pCreateInfo, null, pInstance); - long instance = pInstance.get(0); - memFree(pInstance); - if (err != VK_SUCCESS) { - throw new AssertionError("Failed to create VkInstance: " + VKUtils.translateVulkanResult(err)); - } - VkInstance ret = new VkInstance(instance, pCreateInfo); - pCreateInfo.free(); - memFree(ppEnabledLayerNames); - memFree(VK_EXT_DEBUG_REPORT_EXTENSION); - memFree(ppEnabledExtensionNames); - memFree(appInfo.pApplicationName()); - memFree(appInfo.pEngineName()); - appInfo.free(); - return ret; - } - - public void setupVulkan() - {} -} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKUtils.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKUtils.java index af71bfc..f18fbd1 100644 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKUtils.java +++ b/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VKUtils.java @@ -1,266 +1,242 @@ package com.github.hydos.ginger.engine.vulkan.utils; -import static org.lwjgl.system.MemoryUtil.*; -import static org.lwjgl.util.shaderc.Shaderc.*; -import static org.lwjgl.vulkan.EXTDebugReport.*; -import static org.lwjgl.vulkan.KHRSurface.*; +import java.nio.IntBuffer; +import java.util.stream.IntStream; -import java.io.IOException; -import java.nio.*; - -import org.lwjgl.*; +import org.lwjgl.PointerBuffer; +import org.lwjgl.glfw.*; import org.lwjgl.system.MemoryStack; -import org.lwjgl.util.shaderc.*; import org.lwjgl.vulkan.*; -import com.github.hydos.ginger.engine.common.io.Window; -import com.github.hydos.ginger.engine.common.tools.IOUtil; -import com.github.hydos.ginger.engine.vulkan.VKConstants; -import com.github.hydos.ginger.engine.vulkan.render.renderers.EntityRenderer; -import com.github.hydos.ginger.engine.vulkan.shaders.Pipeline; +import com.github.hydos.ginger.engine.vulkan.VkConstants; -/** @author hydos - * a util library for Vulkan */ -public class VKUtils +public class VkUtils { - public static final int VK_FLAGS_NONE = 0; + private static PointerBuffer getRequiredExtensions() { - public static long startVulkanDebugging(VkInstance instance, int flags, VkDebugReportCallbackEXT callback) - { - VkDebugReportCallbackCreateInfoEXT dbgCreateInfo = VkDebugReportCallbackCreateInfoEXT.calloc() - .sType(VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT) - .pfnCallback(callback) - .flags(flags); - LongBuffer pCallback = memAllocLong(1); - int err = vkCreateDebugReportCallbackEXT(instance, dbgCreateInfo, null, pCallback); - long callbackHandle = pCallback.get(0); - memFree(pCallback); - dbgCreateInfo.free(); - if (err != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create VkInstance: " + VKUtils.translateVulkanResult(err)); } - return callbackHandle; + PointerBuffer glfwExtensions = GLFWVulkan.glfwGetRequiredInstanceExtensions(); + + return glfwExtensions; + } + + + public static void createInstance() { + + try(MemoryStack stack = MemoryStack.stackPush()) { + + // Use calloc to initialize the structs with 0s. Otherwise, the program can crash due to random values + + VkApplicationInfo appInfo = VkApplicationInfo.callocStack(stack); + + appInfo.sType(VK12.VK_STRUCTURE_TYPE_APPLICATION_INFO); + appInfo.pApplicationName(stack.UTF8Safe("GingerGame")); + appInfo.applicationVersion(VK12.VK_MAKE_VERSION(1, 0, 0)); + appInfo.pEngineName(stack.UTF8Safe("Ginger2")); + appInfo.engineVersion(VK12.VK_MAKE_VERSION(2, 0, 0)); + appInfo.apiVersion(VK12.VK_API_VERSION_1_2); + + VkInstanceCreateInfo createInfo = VkInstanceCreateInfo.callocStack(stack); + + createInfo.sType(VK12.VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO); + createInfo.pApplicationInfo(appInfo); + // enabledExtensionCount is implicitly set when you call ppEnabledExtensionNames + createInfo.ppEnabledExtensionNames(getRequiredExtensions()); + + // We need to retrieve the pointer of the created instance + PointerBuffer instancePtr = stack.mallocPointer(1); + + if(VK12.vkCreateInstance(createInfo, null, instancePtr) != VK12.VK_SUCCESS) { + throw new RuntimeException("Failed to create instance"); + } + + VkConstants.vulkanInstance = new VkInstance(instancePtr.get(0), createInfo); + } + } + + public static void createPhysicalDevice() { + try(MemoryStack stack = MemoryStack.stackPush()) { + + IntBuffer deviceCount = stack.ints(0); + + VK12.vkEnumeratePhysicalDevices(VkConstants.vulkanInstance, deviceCount, null); + + if(deviceCount.get(0) == 0) { + throw new RuntimeException("Failed to find GPUs with Vulkan support"); + } + + PointerBuffer ppPhysicalDevices = stack.mallocPointer(deviceCount.get(0)); + + VK12.vkEnumeratePhysicalDevices(VkConstants.vulkanInstance, deviceCount, ppPhysicalDevices); + + VkPhysicalDevice device = null; + + for(int i = 0;i < ppPhysicalDevices.capacity();i++) { + + device = new VkPhysicalDevice(ppPhysicalDevices.get(i), VkConstants.vulkanInstance); + + } + + if(device == null) { + throw new RuntimeException("Failed to find a suitable GPU"); + } + + VkConstants.physicalDevice = device; + } } - private static int vulkanStageToShaderc(int stage) - { - switch (stage) - { - case VK10.VK_SHADER_STAGE_VERTEX_BIT: - return shaderc_vertex_shader; - case VK10.VK_SHADER_STAGE_FRAGMENT_BIT: - return shaderc_fragment_shader; - case NVRayTracing.VK_SHADER_STAGE_RAYGEN_BIT_NV: - return shaderc_raygen_shader; - case NVRayTracing.VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV: - return shaderc_closesthit_shader; - case NVRayTracing.VK_SHADER_STAGE_MISS_BIT_NV: - return shaderc_miss_shader; - case NVRayTracing.VK_SHADER_STAGE_ANY_HIT_BIT_NV: - return shaderc_anyhit_shader; - default: - throw new IllegalArgumentException("Shader stage: " + stage); - } - } + + public static class QueueFamilyIndices { - public static ByteBuffer glslToSpirv(String classPath, int vulkanStage) throws IOException - { - System.out.println("Converting shader: " + classPath + " to SPIRV"); - ByteBuffer src = IOUtil.ioResourceToByteBuffer(classPath, 1024); - long compiler = shaderc_compiler_initialize(); - long options = shaderc_compile_options_initialize(); - ShadercIncludeResolve resolver; - ShadercIncludeResultRelease releaser; - shaderc_compile_options_set_optimization_level(options, shaderc_optimization_level_performance); - shaderc_compile_options_set_include_callbacks(options, resolver = new ShadercIncludeResolve() - { - public long invoke(long user_data, long requested_source, int type, long requesting_source, long include_depth) - { - ShadercIncludeResult res = ShadercIncludeResult.calloc(); - try - { - String src = classPath.substring(0, classPath.lastIndexOf('/')) + "/" + memUTF8(requested_source); - res.content(IOUtil.ioResourceToByteBuffer(src, 1024)); - res.source_name(memUTF8(src)); - return res.address(); - } - catch (IOException e) - { - throw new AssertionError("Failed to resolve include: " + src); - } - } - }, releaser = new ShadercIncludeResultRelease() - { - public void invoke(long user_data, long include_result) - { - ShadercIncludeResult result = ShadercIncludeResult.create(include_result); - memFree(result.source_name()); - result.free(); - } - }, 0L); - long res; - try (MemoryStack stack = MemoryStack.stackPush()) - { - res = shaderc_compile_into_spv(compiler, src, vulkanStageToShaderc(vulkanStage), - stack.UTF8(classPath), stack.UTF8("main"), options); - if (res == 0L) - throw new AssertionError("Internal error during compilation!"); - } - if (shaderc_result_get_compilation_status(res) != shaderc_compilation_status_success) - { throw new AssertionError("Shader compilation failed: " + shaderc_result_get_error_message(res)); } - int size = (int) shaderc_result_get_length(res); - ByteBuffer resultBytes = BufferUtils.createByteBuffer(size); - resultBytes.put(shaderc_result_get_bytes(res)); - resultBytes.flip(); - shaderc_compiler_release(res); - shaderc_compiler_release(compiler); - releaser.free(); - resolver.free(); - return resultBytes; - } + // We use Integer to use null as the empty value + private Integer graphicsFamily; + private Integer presentFamily; - public static String translateVulkanResult(int vulkanResult) + public boolean isComplete() { + return graphicsFamily != null && presentFamily != null; + } + + public int[] unique() { + return IntStream.of(graphicsFamily, presentFamily).distinct().toArray(); + } + } + + + public static void createLogicalDevice() { - switch (vulkanResult) + try(MemoryStack stack = MemoryStack.stackPush()) { - case VK10.VK_SUCCESS: - return "Command successfully completed."; - case VK10.VK_NOT_READY: - return "A query has not yet been completed."; - case VK10.VK_TIMEOUT: - return "A wait operation has timed out."; - case VK10.VK_INCOMPLETE: - return "A return array was too small for the result."; - case KHRSwapchain.VK_SUBOPTIMAL_KHR: - return "A swapchain no longer matches the surface properties exactly, but can still be used to present to the surface successfully."; - case VK10.VK_ERROR_OUT_OF_HOST_MEMORY: - return "A host memory allocation has failed."; - case VK10.VK_ERROR_OUT_OF_DEVICE_MEMORY: - return "A device memory allocation has failed."; - case VK10.VK_ERROR_INITIALIZATION_FAILED: - return "Initialization of an object could not be completed for implementation-specific reasons."; - case VK10.VK_ERROR_DEVICE_LOST: - return "The logical or physical device has been lost."; - case VK10.VK_ERROR_MEMORY_MAP_FAILED: - return "Mapping of a memory object has failed."; - case VK10.VK_ERROR_LAYER_NOT_PRESENT: - return "A requested layer is not present or could not be loaded."; - case VK10.VK_ERROR_EXTENSION_NOT_PRESENT: - return "A requested extension is not supported."; - case VK10.VK_ERROR_FEATURE_NOT_PRESENT: - return "A requested feature is not supported."; - case VK10.VK_ERROR_INCOMPATIBLE_DRIVER: - return "The requested version of Vulkan is not supported by the driver or is otherwise incompatible for implementation-specific reasons."; - case VK10.VK_ERROR_TOO_MANY_OBJECTS: - return "Too many objects of the same type have already been created."; - case VK10.VK_ERROR_FORMAT_NOT_SUPPORTED: - return "The requested format is not supported."; - case VK_ERROR_SURFACE_LOST_KHR: - return "The window is no longer available."; - case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: - return "The requested window is already connected to a VkSurfaceKHR, or to some other non-Vulkan API."; - case KHRDisplaySwapchain.VK_ERROR_INCOMPATIBLE_DISPLAY_KHR: - return "The display used by a swapchain does not use the same presentable image layout, or is incompatible in a way that prevents sharing an" + " image."; - case EXTDebugReport.VK_ERROR_VALIDATION_FAILED_EXT: - return "A validation layer found an error."; - default: - return String.format("%s [%d]", "Is an unknown vulkan result", Integer.valueOf(vulkanResult)); + QueueFamilyIndices indices = findQueueFamilies(); + + int[] uniqueQueueFamilies = indices.unique(); + + VkDeviceQueueCreateInfo.Buffer queueCreateInfos = VkDeviceQueueCreateInfo.callocStack(uniqueQueueFamilies.length, stack); + + for(int i = 0;i < uniqueQueueFamilies.length;i++) { + VkDeviceQueueCreateInfo queueCreateInfo = queueCreateInfos.get(i); + queueCreateInfo.sType(VK12.VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO); + queueCreateInfo.queueFamilyIndex(uniqueQueueFamilies[i]); + queueCreateInfo.pQueuePriorities(stack.floats(1.0f)); + } + + + VkDeviceCreateInfo createInfo = VkDeviceCreateInfo.callocStack(stack); + + createInfo.sType(VK12.VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO); + createInfo.pQueueCreateInfos(queueCreateInfos); + // queueCreateInfoCount is automatically set + + + PointerBuffer pDevice = stack.pointers(VK12.VK_NULL_HANDLE); + + if(VK12.vkCreateDevice(VkConstants.physicalDevice, createInfo, null, pDevice) != VK12.VK_SUCCESS) { + throw new RuntimeException("Failed to create logical device"); + } + + VkConstants.device = new VkDevice(pDevice.get(0), VkConstants.physicalDevice, createInfo); + + PointerBuffer pQueue = stack.pointers(VK12.VK_NULL_HANDLE); + + VK12.vkGetDeviceQueue(VkConstants.device, indices.graphicsFamily, 0, pQueue); + VkConstants.graphicsQueue = new VkQueue(pQueue.get(0), VkConstants.device); + + VK12.vkGetDeviceQueue(VkConstants.device, indices.presentFamily, 0, pQueue); + VkConstants.presentQueue = new VkQueue(pQueue.get(0), VkConstants.device); } } - public static VkCommandBuffer[] setupRenderCommandBuffer(VkDevice device, long commandPool, long[] framebuffers, long renderPass, int width, int height, - Pipeline pipeline, long descriptorSet, long verticesBuf) - { - try (MemoryStack stack = MemoryStack.stackPush()) - { - // Create the render command buffers (one command buffer per framebuffer image) - VkCommandBufferAllocateInfo cmdBufAllocateInfo = VkCommandBufferAllocateInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO) - .commandPool(commandPool) - .level(VK12.VK_COMMAND_BUFFER_LEVEL_PRIMARY) - .commandBufferCount(framebuffers.length); - PointerBuffer pCommandBuffer = memAllocPointer(framebuffers.length); - int result = VK12.vkAllocateCommandBuffers(device, cmdBufAllocateInfo, pCommandBuffer); - if (result != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to create render command buffer: " + VKUtils.translateVulkanResult(result)); } - VkCommandBuffer[] renderCommandBuffers = new VkCommandBuffer[framebuffers.length]; - for (int i = 0; i < framebuffers.length; i++) - { renderCommandBuffers[i] = new VkCommandBuffer(pCommandBuffer.get(i), device); } - memFree(pCommandBuffer); - cmdBufAllocateInfo.free(); - // Create the command buffer begin structure - VkCommandBufferBeginInfo cmdBufInfo = VkCommandBufferBeginInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO); - // Specify clear colour - VkClearValue.Buffer clearValues = VkClearValue.calloc(2); - clearValues.get(0).color() - .float32(0, Window.getColour().x() / 255.0f) - .float32(1, Window.getColour().y() / 255.0f) - .float32(2, Window.getColour().z() / 255.0f) - .float32(3, 1.0f); - // Specify clear depth-stencil - clearValues.get(1).depthStencil().depth(1.0f).stencil(0); - // Specify everything to begin a render pass - VkRenderPassBeginInfo renderPassBeginInfo = VkRenderPassBeginInfo.calloc() - .sType(VK12.VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO) - .renderPass(renderPass) - .pClearValues(clearValues); - VkRect2D renderArea = renderPassBeginInfo.renderArea(); - renderArea.offset().set(0, 0); - renderArea.extent().set(width, height); - for (int i = 0; i < renderCommandBuffers.length; ++i) - { - // Set target frame buffer - renderPassBeginInfo.framebuffer(framebuffers[i]); - result = VK12.vkBeginCommandBuffer(renderCommandBuffers[i], cmdBufInfo); - if (result != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to begin render command buffer: " + VKUtils.translateVulkanResult(result)); } - VK12.vkCmdBeginRenderPass(renderCommandBuffers[i], renderPassBeginInfo, VK12.VK_SUBPASS_CONTENTS_INLINE); - // Update dynamic viewport state - VkViewport.Buffer viewport = VkViewport.calloc(1) - .height(height) - .width(width) - .minDepth(0.0f) - .maxDepth(1.0f); - VK12.vkCmdSetViewport(renderCommandBuffers[i], 0, viewport); - viewport.free(); - // Update dynamic scissor state - VkRect2D.Buffer scissor = VkRect2D.calloc(1); - scissor.extent().set(width, height); - scissor.offset().set(0, 0); - VK12.vkCmdSetScissor(renderCommandBuffers[i], 0, scissor); - scissor.free(); - // Bind descriptor sets describing shader binding points - LongBuffer descriptorSets = memAllocLong(1).put(0, descriptorSet); - VK12.vkCmdBindDescriptorSets(renderCommandBuffers[i], VK12.VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.layout, 0, descriptorSets, null); - memFree(descriptorSets); - // Bind the rendering pipeline (including the shaders) - VK12.vkCmdBindPipeline(renderCommandBuffers[i], VK12.VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.pipeline); - EntityRenderer.tempStaticRender(stack, renderCommandBuffers[i]); + private static QueueFamilyIndices findQueueFamilies() { - VK12.vkCmdEndRenderPass(renderCommandBuffers[i]); - result = VK12.vkEndCommandBuffer(renderCommandBuffers[i]); - if (result != VK12.VK_SUCCESS) - { throw new AssertionError("Failed to begin render command buffer: " + VKUtils.translateVulkanResult(result)); } - } - renderPassBeginInfo.free(); - clearValues.free(); - cmdBufInfo.free(); - return renderCommandBuffers; - } - + QueueFamilyIndices indices = new QueueFamilyIndices(); - } + try(MemoryStack stack = MemoryStack.stackPush()) { - public static void setupVulkanDebugCallback() - { - VKConstants.debugCallback = new VkDebugReportCallbackEXT() - { - public int invoke(int flags, int objectType, long object, long location, int messageCode, long pLayerPrefix, long pMessage, long pUserData) - { - System.err.println("ERROR OCCURED: " + VkDebugReportCallbackEXT.getString(pMessage)); - return 0; - } - }; - } -} \ No newline at end of file + IntBuffer queueFamilyCount = stack.ints(0); + + VK12.vkGetPhysicalDeviceQueueFamilyProperties(VkConstants.physicalDevice, queueFamilyCount, null); + + VkQueueFamilyProperties.Buffer queueFamilies = VkQueueFamilyProperties.mallocStack(queueFamilyCount.get(0), stack); + + VK12.vkGetPhysicalDeviceQueueFamilyProperties(VkConstants.physicalDevice, queueFamilyCount, queueFamilies); + + IntBuffer presentSupport = stack.ints(VK12.VK_FALSE); + + for(int i = 0;i < queueFamilies.capacity() || !indices.isComplete();i++) { + + if((queueFamilies.get(i).queueFlags() & VK12.VK_QUEUE_GRAPHICS_BIT) != 0) { + indices.graphicsFamily = i; + } + + KHRSurface.vkGetPhysicalDeviceSurfaceSupportKHR( + VkConstants.physicalDevice, + i, VkConstants.windowSurface, + presentSupport); + + if(presentSupport.get(0) == VK12.VK_TRUE) { + indices.presentFamily = i; + } + } + + return indices; + } + } + + //some code from LWJGL examples for debugging (has changes) + public static String translateVulkanResult(int result) { + switch (result) { + // Success codes + case VK12.VK_SUCCESS: + return "Command successfully completed."; + case VK12.VK_NOT_READY: + return "A fence or query has not yet completed."; + case VK12.VK_TIMEOUT: + return "A wait operation has not completed in the specified time."; + case VK12.VK_EVENT_SET: + return "An event is signaled."; + case VK12.VK_EVENT_RESET: + return "An event is unsignaled."; + case VK12.VK_INCOMPLETE: + return "A return array was too small for the result."; + case KHRSwapchain.VK_SUBOPTIMAL_KHR: + return "A swapchain no longer matches the surface properties exactly, but can still be used to present to the surface successfully."; + + // Error codes + case VK12.VK_ERROR_OUT_OF_HOST_MEMORY: + return "A host memory allocation has failed."; + case VK12.VK_ERROR_OUT_OF_DEVICE_MEMORY: + return "A device memory allocation has failed."; + case VK12.VK_ERROR_INITIALIZATION_FAILED: + return "Initialization of an object could not be completed for implementation-specific reasons."; + case VK12.VK_ERROR_DEVICE_LOST: + return "The logical or physical device has been lost."; + case VK12.VK_ERROR_MEMORY_MAP_FAILED: + return "Mapping of a memory object has failed."; + case VK12.VK_ERROR_LAYER_NOT_PRESENT: + return "A requested layer is not present or could not be loaded."; + case VK12.VK_ERROR_EXTENSION_NOT_PRESENT: + return "A requested extension is not supported."; + case VK12.VK_ERROR_FEATURE_NOT_PRESENT: + return "A requested feature is not supported."; + case VK12.VK_ERROR_INCOMPATIBLE_DRIVER: + return "The requested version of Vulkan is not supported by the driver or is otherwise incompatible for implementation-specific reasons."; + case VK12.VK_ERROR_TOO_MANY_OBJECTS: + return "Too many objects of the type have already been created."; + case VK12.VK_ERROR_FORMAT_NOT_SUPPORTED: + return "A requested format is not supported on this device."; + case KHRSurface.VK_ERROR_SURFACE_LOST_KHR: + return "A surface is no longer available."; + case KHRSurface.VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: + return "The requested window is already connected to a VkSurfaceKHR, or to some other non-Vulkan API."; + case KHRSwapchain.VK_ERROR_OUT_OF_DATE_KHR: + return "A surface has changed in such a way that it is no longer compatible with the swapchain, and further presentation requests using the " + + "swapchain will fail. Applications must query the new surface properties and recreate their swapchain if they wish to continue" + "presenting to the surface."; + case KHRDisplaySwapchain.VK_ERROR_INCOMPATIBLE_DISPLAY_KHR: + return "The display used by a swapchain does not use the same presentable image layout, or is incompatible in a way that prevents sharing an" + " image."; + case EXTDebugReport.VK_ERROR_VALIDATION_FAILED_EXT: + return "A validation layer found an error."; + default: + return String.format("%s [%d]", "Unknown", Integer.valueOf(result)); + } + } + +} diff --git a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VulkanFuncWrapper.java b/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VulkanFuncWrapper.java deleted file mode 100644 index 64f1163..0000000 --- a/src/main/java/com/github/hydos/ginger/engine/vulkan/utils/VulkanFuncWrapper.java +++ /dev/null @@ -1,301 +0,0 @@ -package com.github.hydos.ginger.engine.vulkan.utils; - -import static org.lwjgl.vulkan.EXTDebugReport.VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; -import static org.lwjgl.vulkan.KHR8bitStorage.VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR; -import static org.lwjgl.vulkan.KHRGetMemoryRequirements2.VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR; -import static org.lwjgl.vulkan.KHRGetPhysicalDeviceProperties2.*; -import static org.lwjgl.vulkan.KHRShaderFloat16Int8.VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR; -import static org.lwjgl.vulkan.KHRSwapchain.*; -import static org.lwjgl.vulkan.NVRayTracing.*; -import static org.lwjgl.vulkan.VK10.*; - -import org.lwjgl.system.MemoryStack; -import org.lwjgl.util.vma.*; -import org.lwjgl.vulkan.*; -/** - * - * @author hydos - * used to make the vulkan api more readable - * - */ -public class VulkanFuncWrapper -{ - public static VmaVulkanFunctions VmaVulkanFunctions(MemoryStack stack) - { return VmaVulkanFunctions.callocStack(stack); } - - public static VmaAllocatorCreateInfo VmaAllocatorCreateInfo(MemoryStack stack) - { return VmaAllocatorCreateInfo.callocStack(stack); } - - public static VkInstanceCreateInfo VkInstanceCreateInfo(MemoryStack stack) - { return VkInstanceCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO); } - - public static VkApplicationInfo VkApplicationInfo(MemoryStack stack) - { return VkApplicationInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_APPLICATION_INFO); } - - public static VkDebugReportCallbackCreateInfoEXT VkDebugReportCallbackCreateInfoEXT(MemoryStack stack) - { return VkDebugReportCallbackCreateInfoEXT.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT); } - - public static VkDeviceCreateInfo VkDeviceCreateInfo(MemoryStack stack) - { return VkDeviceCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO); } - - public static VkDeviceQueueCreateInfo.Buffer VkDeviceQueueCreateInfo(MemoryStack stack) - { return VkDeviceQueueCreateInfo.callocStack(1, stack).sType(VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO); } - - public static VkPhysicalDevice8BitStorageFeaturesKHR VkPhysicalDevice8BitStorageFeaturesKHR(MemoryStack stack) - { return VkPhysicalDevice8BitStorageFeaturesKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR); } - - public static VkPhysicalDeviceFloat16Int8FeaturesKHR VkPhysicalDeviceFloat16Int8FeaturesKHR(MemoryStack stack) - { return VkPhysicalDeviceFloat16Int8FeaturesKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR); } - - public static VkPhysicalDeviceProperties2 VkPhysicalDeviceProperties2(MemoryStack stack) - { return VkPhysicalDeviceProperties2.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR); } - - public static VkPhysicalDeviceRayTracingPropertiesNV VkPhysicalDeviceRayTracingPropertiesNV(MemoryStack stack) - { return VkPhysicalDeviceRayTracingPropertiesNV.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV); } - - public static VkSwapchainCreateInfoKHR VkSwapchainCreateInfoKHR(MemoryStack stack) - { return VkSwapchainCreateInfoKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR); } - - public static VkImageViewCreateInfo VkImageViewCreateInfo(MemoryStack stack) - { return VkImageViewCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO); } - - public static VkCommandPoolCreateInfo VkCommandPoolCreateInfo(MemoryStack stack) - { return VkCommandPoolCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO); } - - public static VkMemoryRequirements VkMemoryRequirements(MemoryStack stack) - { return VkMemoryRequirements.callocStack(stack); } - - public static VkImageCreateInfo VkImageCreateInfo(MemoryStack stack) - { return VkImageCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO); } - - public static VkImageMemoryBarrier.Buffer VkImageMemoryBarrier(MemoryStack stack) - { return VkImageMemoryBarrier.callocStack(1, stack).sType(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER); } - - public static VkFenceCreateInfo VkFenceCreateInfo(MemoryStack stack) - { return VkFenceCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_FENCE_CREATE_INFO); } - - public static VkSubmitInfo VkSubmitInfo(MemoryStack stack) - { return VkSubmitInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SUBMIT_INFO); } - - public static VkCommandBufferBeginInfo VkCommandBufferBeginInfo(MemoryStack stack) - { return VkCommandBufferBeginInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO); } - - public static VkCommandBufferAllocateInfo VkCommandBufferAllocateInfo(MemoryStack stack) - { return VkCommandBufferAllocateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO); } - - public static VkMemoryAllocateInfo VkMemoryAllocateInfo(MemoryStack stack) - { return VkMemoryAllocateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); } - - public static VkBufferCreateInfo VkBufferCreateInfo(MemoryStack stack) - { return VkBufferCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO); } - - public static VkGeometryAABBNV VkGeometryAABBNV(VkGeometryAABBNV geometry) - { return geometry.sType(VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV); } - - public static VkGeometryTrianglesNV VkGeometryTrianglesNV(VkGeometryTrianglesNV geometry) - { return geometry.sType(VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV); } - - public static VkGeometryNV VkGeometryNV(MemoryStack stack) - { return VkGeometryNV.callocStack(stack).sType(VK_STRUCTURE_TYPE_GEOMETRY_NV); } - - public static VkMemoryBarrier.Buffer VkMemoryBarrier(MemoryStack stack) - { return VkMemoryBarrier.callocStack(1, stack).sType(VK_STRUCTURE_TYPE_MEMORY_BARRIER); } - - public static VkBindAccelerationStructureMemoryInfoNV.Buffer VkBindAccelerationStructureMemoryInfoNV(MemoryStack stack) - { return VkBindAccelerationStructureMemoryInfoNV.callocStack(1, stack) - .sType(VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV); } - - public static VkAccelerationStructureInfoNV VkAccelerationStructureInfoNV(MemoryStack stack) - { return VkAccelerationStructureInfoNV.callocStack(stack).sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV); } - - public static VkMemoryRequirements2KHR VkMemoryRequirements2KHR(MemoryStack stack) - { return VkMemoryRequirements2KHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR); } - - public static VkAccelerationStructureMemoryRequirementsInfoNV VkAccelerationStructureMemoryRequirementsInfoNV( - MemoryStack stack) - { return VkAccelerationStructureMemoryRequirementsInfoNV.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV); } - - public static VkAccelerationStructureCreateInfoNV VkAccelerationStructureCreateInfoNV(MemoryStack stack) - { return VkAccelerationStructureCreateInfoNV.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV); } - - public static VkPipelineShaderStageCreateInfo.Buffer VkPipelineShaderStageCreateInfo(MemoryStack stack, int count) - { - VkPipelineShaderStageCreateInfo.Buffer ret = VkPipelineShaderStageCreateInfo.callocStack(count, stack); - ret.forEach(sci -> sci.sType(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO)); - return ret; - } - - public static VkDescriptorSetLayoutBinding.Buffer VkDescriptorSetLayoutBinding(MemoryStack stack, int count) - { return VkDescriptorSetLayoutBinding.callocStack(count, stack); } - - public static VkDescriptorSetLayoutBinding VkDescriptorSetLayoutBinding(MemoryStack stack) - { return VkDescriptorSetLayoutBinding.callocStack(stack); } - - public static VkRayTracingPipelineCreateInfoNV.Buffer VkRayTracingPipelineCreateInfoNV(MemoryStack stack) - { return VkRayTracingPipelineCreateInfoNV.callocStack(1, stack) - .sType(VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV); } - - public static VkRayTracingShaderGroupCreateInfoNV.Buffer VkRayTracingShaderGroupCreateInfoNV(int size, MemoryStack stack) - { - VkRayTracingShaderGroupCreateInfoNV.Buffer buf = VkRayTracingShaderGroupCreateInfoNV.callocStack(size, stack); - buf.forEach(info -> info.sType(VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV) - .anyHitShader(VK_SHADER_UNUSED_NV) - .closestHitShader(VK_SHADER_UNUSED_NV) - .generalShader(VK_SHADER_UNUSED_NV) - .intersectionShader(VK_SHADER_UNUSED_NV)); - return buf; - } - - public static VkPipelineLayoutCreateInfo VkPipelineLayoutCreateInfo(MemoryStack stack) - { return VkPipelineLayoutCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO); } - - public static VkDescriptorSetLayoutCreateInfo VkDescriptorSetLayoutCreateInfo(MemoryStack stack) - { return VkDescriptorSetLayoutCreateInfo.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO); } - - public static VkDescriptorBufferInfo.Buffer VkDescriptorBufferInfo(MemoryStack stack, int count) - { return VkDescriptorBufferInfo.callocStack(count, stack); } - - public static VkDescriptorImageInfo.Buffer VkDescriptorImageInfo(MemoryStack stack, int count) - { return VkDescriptorImageInfo.callocStack(count, stack); } - - public static VkDescriptorPoolSize.Buffer VkDescriptorPoolSize(MemoryStack stack, int count) - { return VkDescriptorPoolSize.callocStack(count, stack); } - - public static VkWriteDescriptorSetAccelerationStructureNV VkWriteDescriptorSetAccelerationStructureNV(MemoryStack stack) - { return VkWriteDescriptorSetAccelerationStructureNV.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV); } - - public static VkWriteDescriptorSet VkWriteDescriptorSet(MemoryStack stack) - { return VkWriteDescriptorSet.callocStack(stack).sType(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET); } - - public static VkDescriptorSetAllocateInfo VkDescriptorSetAllocateInfo(MemoryStack stack) - { return VkDescriptorSetAllocateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO); } - - public static VkDescriptorPoolCreateInfo VkDescriptorPoolCreateInfo(MemoryStack stack) - { return VkDescriptorPoolCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO); } - - public static VkPresentInfoKHR VkPresentInfoKHR(MemoryStack stack) - { return VkPresentInfoKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_PRESENT_INFO_KHR); } - - public static VkSemaphoreCreateInfo VkSemaphoreCreateInfo(MemoryStack stack) - { return VkSemaphoreCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO); } - - public static VkQueueFamilyProperties.Buffer VkQueueFamilyProperties(int count) - { return VkQueueFamilyProperties.callocStack(count); } - - public static VkPhysicalDeviceFeatures VkPhysicalDeviceFeatures(MemoryStack stack) - { return VkPhysicalDeviceFeatures.callocStack(stack); } - - public static VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2(MemoryStack stack) - { return VkPhysicalDeviceFeatures2.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR); } - - public static VkPhysicalDeviceProperties VkPhysicalDeviceProperties(MemoryStack stack) - { return VkPhysicalDeviceProperties.callocStack(stack); } - - public static VkGeometryNV.Buffer VkGeometryNV(MemoryStack stack, int count) - { - VkGeometryNV.Buffer buf = VkGeometryNV.callocStack(count, stack); - buf.forEach(info -> info.sType(VK_STRUCTURE_TYPE_GEOMETRY_NV)); - return buf; - } - - public static VkPipelineShaderStageCreateInfo VkPipelineShaderStageCreateInfo(MemoryStack stack) - { return VkPipelineShaderStageCreateInfo.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO); } - - public static VkShaderModuleCreateInfo VkShaderModuleCreateInfo(MemoryStack stack) - { return VkShaderModuleCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO); } - - public static VkSurfaceCapabilitiesKHR VkSurfaceCapabilitiesKHR(MemoryStack stack) - { return VkSurfaceCapabilitiesKHR.callocStack(stack); } - - public static VkSurfaceFormatKHR.Buffer VkSurfaceFormatKHR(MemoryStack stack, int count) - { return VkSurfaceFormatKHR.callocStack(count, stack); } - - public static VmaAllocationCreateInfo VmaAllocationCreateInfo(MemoryStack stack) - { return VmaAllocationCreateInfo.callocStack(stack); } - - public static VmaAllocationInfo VmaAllocationInfo(MemoryStack stack) - { return VmaAllocationInfo.callocStack(stack); } - - public static VkBufferCopy.Buffer VkBufferCopy(MemoryStack stack, int count) - { return VkBufferCopy.callocStack(count, stack); } - - public static VkSamplerCreateInfo VkSamplerCreateInfo(MemoryStack stack) - { return VkSamplerCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO); } - - public static VkBufferImageCopy.Buffer VkBufferImageCopy(MemoryStack stack) - { return VkBufferImageCopy.callocStack(1, stack); } - - public static VkImageSubresourceRange VkImageSubresourceRange(MemoryStack stack) - { return VkImageSubresourceRange.callocStack(stack); } - - public static VkComponentMapping VkComponentMapping(MemoryStack stack) - { return VkComponentMapping.callocStack(stack); } - - public static VkAttachmentReference VkAttachmentReference(MemoryStack stack) - { return VkAttachmentReference.callocStack(stack); } - - public static VkAttachmentReference.Buffer VkAttachmentReference(MemoryStack stack, int count) - { return VkAttachmentReference.callocStack(count, stack); } - - public static VkSubpassDescription.Buffer VkSubpassDescription(MemoryStack stack, int count) - { return VkSubpassDescription.callocStack(count, stack); } - - public static VkAttachmentDescription.Buffer VkAttachmentDescription(MemoryStack stack, int count) - { return VkAttachmentDescription.callocStack(count, stack); } - - public static VkRenderPassCreateInfo VkRenderPassCreateInfo(MemoryStack stack) - { return VkRenderPassCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO); } - - public static VkOffset3D VkOffset3D(MemoryStack stack) - { return VkOffset3D.callocStack(stack); } - - public static VkGeometryNV.Buffer VkGeometryNV(int count) - { return VkGeometryNV.calloc(count).sType(VK_STRUCTURE_TYPE_GEOMETRY_NV); } - - public static VkFramebufferCreateInfo VkFramebufferCreateInfo(MemoryStack stack) - { return VkFramebufferCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO); } - - public static VkPipelineRasterizationStateCreateInfo VkPipelineRasterizationStateCreateInfo(MemoryStack stack) - { return VkPipelineRasterizationStateCreateInfo.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO); } - - public static VkPipelineDepthStencilStateCreateInfo VkPipelineDepthStencilStateCreateInfo(MemoryStack stack) - { return VkPipelineDepthStencilStateCreateInfo.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO); } - - public static VkPipelineMultisampleStateCreateInfo VkPipelineMultisampleStateCreateInfo(MemoryStack stack) - { return VkPipelineMultisampleStateCreateInfo.callocStack(stack) - .sType(VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO); } - - public static VkGraphicsPipelineCreateInfo.Buffer VkGraphicsPipelineCreateInfo(MemoryStack stack, int count) - { - VkGraphicsPipelineCreateInfo.Buffer ret = VkGraphicsPipelineCreateInfo.callocStack(count, stack); - ret.forEach(pci -> pci.sType(VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO)); - return ret; - } - - public static VkClearValue.Buffer VkClearValue(MemoryStack stack, int count) - { return VkClearValue.callocStack(count, stack); } - - public static VkRenderPassBeginInfo VkRenderPassBeginInfo(MemoryStack stack) - { return VkRenderPassBeginInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO); } - - public static VkViewport.Buffer VkViewport(MemoryStack stack, int count) - { return VkViewport.callocStack(count, stack); } - - public static VkFormatProperties VkFormatProperties(MemoryStack stack) - { return VkFormatProperties.callocStack(stack); } - - public static VkSubpassDependency.Buffer VkSubpassDependency(MemoryStack stack, int count) - { return VkSubpassDependency.callocStack(count, stack); } - - public static VkImageCopy.Buffer VkImageCopy(MemoryStack stack, int count) - { return VkImageCopy.callocStack(count, stack); } -} \ No newline at end of file