moved around shader code and other vulkan stuff
parent
cab3121c7a
commit
e5b2fbf25d
|
@ -5,7 +5,7 @@
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-13">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="module" value="true"/>
|
<attribute name="module" value="true"/>
|
||||||
<attribute name="maven.pomderived" value="true"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
|
|
@ -1,25 +1,194 @@
|
||||||
package com.github.hydos.ginger;
|
package com.github.hydos.ginger;
|
||||||
|
|
||||||
import static org.lwjgl.glfw.GLFW.*;
|
import static org.lwjgl.glfw.GLFW.GLFW_KEY_ESCAPE;
|
||||||
import static org.lwjgl.glfw.GLFWVulkan.*;
|
import static org.lwjgl.glfw.GLFW.GLFW_RELEASE;
|
||||||
import static org.lwjgl.system.MemoryUtil.*;
|
import static org.lwjgl.glfw.GLFW.glfwDestroyWindow;
|
||||||
import static org.lwjgl.vulkan.EXTDebugReport.*;
|
import static org.lwjgl.glfw.GLFW.glfwPollEvents;
|
||||||
import static org.lwjgl.vulkan.KHRSurface.*;
|
import static org.lwjgl.glfw.GLFW.glfwSetFramebufferSizeCallback;
|
||||||
import static org.lwjgl.vulkan.KHRSwapchain.*;
|
import static org.lwjgl.glfw.GLFW.glfwSetKeyCallback;
|
||||||
import static org.lwjgl.vulkan.VK10.*;
|
import static org.lwjgl.glfw.GLFW.glfwSetWindowShouldClose;
|
||||||
|
import static org.lwjgl.glfw.GLFW.glfwShowWindow;
|
||||||
|
import static org.lwjgl.glfw.GLFW.glfwTerminate;
|
||||||
|
import static org.lwjgl.glfw.GLFW.glfwWindowShouldClose;
|
||||||
|
import static org.lwjgl.glfw.GLFWVulkan.glfwCreateWindowSurface;
|
||||||
|
import static org.lwjgl.glfw.GLFWVulkan.glfwGetRequiredInstanceExtensions;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.NULL;
|
||||||
|
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.memByteBuffer;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memCopy;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memFree;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memUTF8;
|
||||||
|
import static org.lwjgl.vulkan.EXTDebugReport.VK_DEBUG_REPORT_ERROR_BIT_EXT;
|
||||||
|
import static org.lwjgl.vulkan.EXTDebugReport.VK_DEBUG_REPORT_WARNING_BIT_EXT;
|
||||||
|
import static org.lwjgl.vulkan.EXTDebugReport.vkDestroyDebugReportCallbackEXT;
|
||||||
|
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_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.vkAcquireNextImageKHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.vkCreateSwapchainKHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.vkDestroySwapchainKHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.vkGetSwapchainImagesKHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.vkQueuePresentKHR;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_ATTACHMENT_STORE_OP_STORE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_B8G8R8A8_UNORM;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_D16_UNORM;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_D16_UNORM_S8_UINT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_D24_UNORM_S8_UINT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_D32_SFLOAT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_D32_SFLOAT_S8_UINT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_R32G32B32_SFLOAT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FORMAT_UNDEFINED;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_TILING_OPTIMAL;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_TYPE_2D;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_IMAGE_VIEW_TYPE_2D;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_NULL_HANDLE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_QUEUE_GRAPHICS_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SHADER_STAGE_VERTEX_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SUCCESS;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_TRUE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_VERTEX_INPUT_RATE_VERTEX;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkAllocateCommandBuffers;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkAllocateDescriptorSets;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkAllocateMemory;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkBeginCommandBuffer;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkBindBufferMemory;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkBindImageMemory;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateBuffer;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateCommandPool;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateDescriptorPool;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateDescriptorSetLayout;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateFramebuffer;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateImage;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateImageView;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateRenderPass;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateSemaphore;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkDestroyFramebuffer;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkDestroySemaphore;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkEndCommandBuffer;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkGetBufferMemoryRequirements;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkGetDeviceQueue;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkGetImageMemoryRequirements;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkGetPhysicalDeviceFormatProperties;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkGetPhysicalDeviceQueueFamilyProperties;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkMapMemory;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkQueueSubmit;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkQueueWaitIdle;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkResetCommandPool;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkUnmapMemory;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkUpdateDescriptorSets;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.*;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.FloatBuffer;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
|
import java.nio.LongBuffer;
|
||||||
|
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
import org.lwjgl.PointerBuffer;
|
import org.lwjgl.PointerBuffer;
|
||||||
import org.lwjgl.glfw.*;
|
import org.lwjgl.glfw.GLFWFramebufferSizeCallback;
|
||||||
import org.lwjgl.vulkan.*;
|
import org.lwjgl.glfw.GLFWKeyCallback;
|
||||||
|
import org.lwjgl.vulkan.VkAttachmentDescription;
|
||||||
|
import org.lwjgl.vulkan.VkAttachmentReference;
|
||||||
|
import org.lwjgl.vulkan.VkBufferCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkCommandBuffer;
|
||||||
|
import org.lwjgl.vulkan.VkCommandBufferAllocateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkCommandBufferBeginInfo;
|
||||||
|
import org.lwjgl.vulkan.VkCommandPoolCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkDescriptorBufferInfo;
|
||||||
|
import org.lwjgl.vulkan.VkDescriptorPoolCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkDescriptorPoolSize;
|
||||||
|
import org.lwjgl.vulkan.VkDescriptorSetAllocateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkDescriptorSetLayoutBinding;
|
||||||
|
import org.lwjgl.vulkan.VkDescriptorSetLayoutCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkDevice;
|
||||||
|
import org.lwjgl.vulkan.VkExtent2D;
|
||||||
|
import org.lwjgl.vulkan.VkFormatProperties;
|
||||||
|
import org.lwjgl.vulkan.VkFramebufferCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkImageCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkImageViewCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkInstance;
|
||||||
|
import org.lwjgl.vulkan.VkMemoryAllocateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkMemoryRequirements;
|
||||||
|
import org.lwjgl.vulkan.VkPhysicalDevice;
|
||||||
|
import org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPresentInfoKHR;
|
||||||
|
import org.lwjgl.vulkan.VkQueue;
|
||||||
|
import org.lwjgl.vulkan.VkQueueFamilyProperties;
|
||||||
|
import org.lwjgl.vulkan.VkRenderPassCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkSemaphoreCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkSubmitInfo;
|
||||||
|
import org.lwjgl.vulkan.VkSubpassDescription;
|
||||||
|
import org.lwjgl.vulkan.VkSurfaceCapabilitiesKHR;
|
||||||
|
import org.lwjgl.vulkan.VkSurfaceFormatKHR;
|
||||||
|
import org.lwjgl.vulkan.VkSwapchainCreateInfoKHR;
|
||||||
|
import org.lwjgl.vulkan.VkVertexInputAttributeDescription;
|
||||||
|
import org.lwjgl.vulkan.VkVertexInputBindingDescription;
|
||||||
|
import org.lwjgl.vulkan.VkWriteDescriptorSet;
|
||||||
|
|
||||||
import com.github.hydos.ginger.engine.common.info.RenderAPI;
|
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.io.Window;
|
||||||
import com.github.hydos.ginger.engine.vulkan.utils.*;
|
import com.github.hydos.ginger.engine.vulkan.VKConstants;
|
||||||
import com.github.hydos.ginger.engine.vulkan.utils.VKUtils.Pipeline;
|
import com.github.hydos.ginger.engine.vulkan.shaders.Pipeline;
|
||||||
|
import com.github.hydos.ginger.engine.vulkan.shaders.VKShaderManager;
|
||||||
|
import com.github.hydos.ginger.engine.vulkan.utils.VKDeviceProperties;
|
||||||
|
import com.github.hydos.ginger.engine.vulkan.utils.VKLoader;
|
||||||
|
import com.github.hydos.ginger.engine.vulkan.utils.VKUtils;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author hydos06
|
* @author hydos06
|
||||||
|
@ -28,80 +197,6 @@ import com.github.hydos.ginger.engine.vulkan.utils.VKUtils.Pipeline;
|
||||||
*/
|
*/
|
||||||
public class VulkanStarter
|
public class VulkanStarter
|
||||||
{
|
{
|
||||||
private static VkPhysicalDevice getFirstPhysicalDevice(VkInstance instance)
|
|
||||||
{
|
|
||||||
IntBuffer pPhysicalDeviceCount = memAllocInt(1);
|
|
||||||
int err = vkEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, null);
|
|
||||||
if (err != VK_SUCCESS)
|
|
||||||
{ throw new AssertionError("Failed to get number of physical devices: " + VKUtils.translateVulkanResult(err)); }
|
|
||||||
PointerBuffer pPhysicalDevices = memAllocPointer(pPhysicalDeviceCount.get(0));
|
|
||||||
err = vkEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
|
|
||||||
long physicalDevice = pPhysicalDevices.get(0);
|
|
||||||
memFree(pPhysicalDeviceCount);
|
|
||||||
memFree(pPhysicalDevices);
|
|
||||||
if (err != VK_SUCCESS)
|
|
||||||
{ throw new AssertionError("Failed to get physical devices: " + VKUtils.translateVulkanResult(err)); }
|
|
||||||
return new VkPhysicalDevice(physicalDevice, instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class DeviceAndGraphicsQueueFamily
|
|
||||||
{
|
|
||||||
VkDevice device;
|
|
||||||
int queueFamilyIndex;
|
|
||||||
VkPhysicalDeviceMemoryProperties memoryProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DeviceAndGraphicsQueueFamily createDeviceAndGetGraphicsQueueFamily(VkPhysicalDevice physicalDevice)
|
|
||||||
{
|
|
||||||
IntBuffer pQueueFamilyPropertyCount = memAllocInt(1);
|
|
||||||
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, null);
|
|
||||||
int queueCount = pQueueFamilyPropertyCount.get(0);
|
|
||||||
VkQueueFamilyProperties.Buffer queueProps = VkQueueFamilyProperties.calloc(queueCount);
|
|
||||||
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, queueProps);
|
|
||||||
memFree(pQueueFamilyPropertyCount);
|
|
||||||
int graphicsQueueFamilyIndex;
|
|
||||||
for (graphicsQueueFamilyIndex = 0; graphicsQueueFamilyIndex < queueCount; graphicsQueueFamilyIndex++)
|
|
||||||
{ if ((queueProps.get(graphicsQueueFamilyIndex).queueFlags() & VK_QUEUE_GRAPHICS_BIT) != 0)
|
|
||||||
break; }
|
|
||||||
queueProps.free();
|
|
||||||
FloatBuffer pQueuePriorities = memAllocFloat(1).put(0.0f);
|
|
||||||
pQueuePriorities.flip();
|
|
||||||
VkDeviceQueueCreateInfo.Buffer queueCreateInfo = VkDeviceQueueCreateInfo.calloc(1)
|
|
||||||
.sType(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(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
|
|
||||||
.pQueueCreateInfos(queueCreateInfo)
|
|
||||||
.ppEnabledExtensionNames(extensions)
|
|
||||||
.ppEnabledLayerNames(ppEnabledLayerNames);
|
|
||||||
PointerBuffer pDevice = memAllocPointer(1);
|
|
||||||
int err = vkCreateDevice(physicalDevice, deviceCreateInfo, null, pDevice);
|
|
||||||
long device = pDevice.get(0);
|
|
||||||
memFree(pDevice);
|
|
||||||
if (err != VK_SUCCESS)
|
|
||||||
{ throw new AssertionError("Failed to create device: " + VKUtils.translateVulkanResult(err)); }
|
|
||||||
VkPhysicalDeviceMemoryProperties memoryProperties = VkPhysicalDeviceMemoryProperties.calloc();
|
|
||||||
vkGetPhysicalDeviceMemoryProperties(physicalDevice, memoryProperties);
|
|
||||||
DeviceAndGraphicsQueueFamily ret = new DeviceAndGraphicsQueueFamily();
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean getSupportedDepthFormat(VkPhysicalDevice physicalDevice, IntBuffer depthFormat)
|
private static boolean getSupportedDepthFormat(VkPhysicalDevice physicalDevice, IntBuffer depthFormat)
|
||||||
{
|
{
|
||||||
|
@ -562,32 +657,6 @@ public class VulkanStarter
|
||||||
{ throw new AssertionError("Failed to submit command buffer: " + VKUtils.translateVulkanResult(err)); }
|
{ throw new AssertionError("Failed to submit command buffer: " + VKUtils.translateVulkanResult(err)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
private 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(loadShader(classPath, device, stage))
|
|
||||||
.pName(memUTF8("main"));
|
|
||||||
return shaderStage;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean getMemoryType(VkPhysicalDeviceMemoryProperties deviceMemoryProperties, int typeBits, int properties, IntBuffer typeIndex)
|
private static boolean getMemoryType(VkPhysicalDeviceMemoryProperties deviceMemoryProperties, int typeBits, int properties, IntBuffer typeIndex)
|
||||||
{
|
{
|
||||||
int bits = typeBits;
|
int bits = typeBits;
|
||||||
|
@ -849,116 +918,6 @@ public class VulkanStarter
|
||||||
return descriptorSetLayout;
|
return descriptorSetLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
private 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(loadShader(device, "/vulkan/shaders/entityVertexShader.glsl", VK_SHADER_STAGE_VERTEX_BIT));
|
|
||||||
shaderStages.get(1).set(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)); }
|
|
||||||
Pipeline ret = new Pipeline();
|
|
||||||
ret.layout = layout;
|
|
||||||
ret.pipeline = pipeline;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void updateUbo(VkDevice device, UboDescriptor ubo, float angle)
|
private static void updateUbo(VkDevice device, UboDescriptor ubo, float angle)
|
||||||
{ //a UBO is a uniform buffer object
|
{ //a UBO is a uniform buffer object
|
||||||
Matrix4f m = new Matrix4f()
|
Matrix4f m = new Matrix4f()
|
||||||
|
@ -998,8 +957,8 @@ public class VulkanStarter
|
||||||
final VkInstance instance = VKLoader.createInstance(requiredExtensions);
|
final VkInstance instance = VKLoader.createInstance(requiredExtensions);
|
||||||
VKUtils.setupVulkanDebugCallback();
|
VKUtils.setupVulkanDebugCallback();
|
||||||
final long debugCallbackHandle = VKUtils.startVulkanDebugging(instance, VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, VKConstants.debugCallback);
|
final long debugCallbackHandle = VKUtils.startVulkanDebugging(instance, VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, VKConstants.debugCallback);
|
||||||
final VkPhysicalDevice physicalDevice = getFirstPhysicalDevice(instance);
|
final VkPhysicalDevice physicalDevice = VKDeviceProperties.getFirstPhysicalDevice(instance);
|
||||||
final DeviceAndGraphicsQueueFamily deviceAndGraphicsQueueFamily = createDeviceAndGetGraphicsQueueFamily(physicalDevice);
|
final VKDeviceProperties deviceAndGraphicsQueueFamily = VKDeviceProperties.initDeviceProperties(physicalDevice);
|
||||||
final VkDevice device = deviceAndGraphicsQueueFamily.device;
|
final VkDevice device = deviceAndGraphicsQueueFamily.device;
|
||||||
int queueFamilyIndex = deviceAndGraphicsQueueFamily.queueFamilyIndex;
|
int queueFamilyIndex = deviceAndGraphicsQueueFamily.queueFamilyIndex;
|
||||||
final VkPhysicalDeviceMemoryProperties memoryProperties = deviceAndGraphicsQueueFamily.memoryProperties;
|
final VkPhysicalDeviceMemoryProperties memoryProperties = deviceAndGraphicsQueueFamily.memoryProperties;
|
||||||
|
@ -1026,12 +985,12 @@ public class VulkanStarter
|
||||||
final VkQueue queue = createDeviceQueue(device, queueFamilyIndex);
|
final VkQueue queue = createDeviceQueue(device, queueFamilyIndex);
|
||||||
final long renderPass = createRenderPass(device, colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.depthFormat);
|
final long renderPass = createRenderPass(device, colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.depthFormat);
|
||||||
final long renderCommandPool = createCommandPool(device, queueFamilyIndex);
|
final long renderCommandPool = createCommandPool(device, queueFamilyIndex);
|
||||||
final Vertices vertices = createVertices(memoryProperties, device);
|
Vertices vertices = createVertices(memoryProperties, device);
|
||||||
UboDescriptor uboDescriptor = createUniformBuffer(memoryProperties, device);
|
UboDescriptor uboDescriptor = createUniformBuffer(memoryProperties, device);
|
||||||
final long descriptorPool = createDescriptorPool(device);
|
final long descriptorPool = createDescriptorPool(device);
|
||||||
final long descriptorSetLayout = createDescriptorSetLayout(device);
|
final long descriptorSetLayout = createDescriptorSetLayout(device);
|
||||||
final long descriptorSet = createDescriptorSet(device, descriptorPool, descriptorSetLayout, uboDescriptor);
|
final long descriptorSet = createDescriptorSet(device, descriptorPool, descriptorSetLayout, uboDescriptor);
|
||||||
final Pipeline pipeline = createPipeline(device, renderPass, vertices.createInfo, descriptorSetLayout);
|
final Pipeline pipeline = Pipeline.createPipeline(device, renderPass, vertices.createInfo, descriptorSetLayout);
|
||||||
final class SwapchainRecreator
|
final class SwapchainRecreator
|
||||||
{
|
{
|
||||||
boolean mustRecreate = true;
|
boolean mustRecreate = true;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package com.github.hydos.ginger.engine.vulkan.utils;
|
package com.github.hydos.ginger.engine.vulkan;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
|
@ -0,0 +1,166 @@
|
||||||
|
package com.github.hydos.ginger.engine.vulkan.shaders;
|
||||||
|
|
||||||
|
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.VK10.VK_COMPARE_OP_ALWAYS;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_COMPARE_OP_LESS_OR_EQUAL;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_CULL_MODE_NONE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_DYNAMIC_STATE_SCISSOR;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_DYNAMIC_STATE_VIEWPORT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_FRONT_FACE_COUNTER_CLOCKWISE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_NULL_HANDLE;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_POLYGON_MODE_FILL;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SHADER_STAGE_VERTEX_BIT;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STENCIL_OP_KEEP;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SUCCESS;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateGraphicsPipelines;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreatePipelineLayout;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
|
import java.nio.LongBuffer;
|
||||||
|
|
||||||
|
import org.lwjgl.vulkan.VkDevice;
|
||||||
|
import org.lwjgl.vulkan.VkGraphicsPipelineCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineColorBlendStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineDepthStencilStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineDynamicStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineInputAssemblyStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineLayoutCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineMultisampleStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineRasterizationStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineViewportStateCreateInfo;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.github.hydos.ginger.engine.vulkan.shaders;
|
||||||
|
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memAllocLong;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memFree;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memUTF8;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||||
|
import static org.lwjgl.vulkan.VK10.VK_SUCCESS;
|
||||||
|
import static org.lwjgl.vulkan.VK10.vkCreateShaderModule;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.LongBuffer;
|
||||||
|
|
||||||
|
import org.lwjgl.vulkan.VkDevice;
|
||||||
|
import org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkShaderModuleCreateInfo;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
package com.github.hydos.ginger.engine.vulkan.utils;
|
||||||
|
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memAllocFloat;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memAllocInt;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memAllocPointer;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memFree;
|
||||||
|
import static org.lwjgl.system.MemoryUtil.memUTF8;
|
||||||
|
import static org.lwjgl.vulkan.KHRSwapchain.VK_KHR_SWAPCHAIN_EXTENSION_NAME;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.FloatBuffer;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
|
|
||||||
|
import org.lwjgl.PointerBuffer;
|
||||||
|
import org.lwjgl.vulkan.VK12;
|
||||||
|
import org.lwjgl.vulkan.VkDevice;
|
||||||
|
import org.lwjgl.vulkan.VkDeviceCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkDeviceQueueCreateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkInstance;
|
||||||
|
import org.lwjgl.vulkan.VkPhysicalDevice;
|
||||||
|
import org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties;
|
||||||
|
import org.lwjgl.vulkan.VkQueueFamilyProperties;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,8 @@ import java.nio.ByteBuffer;
|
||||||
import org.lwjgl.PointerBuffer;
|
import org.lwjgl.PointerBuffer;
|
||||||
import org.lwjgl.vulkan.*;
|
import org.lwjgl.vulkan.*;
|
||||||
|
|
||||||
|
import com.github.hydos.ginger.engine.vulkan.VKConstants;
|
||||||
|
|
||||||
/** @author hydos
|
/** @author hydos
|
||||||
* used to load vulkan related objects such as textures */
|
* used to load vulkan related objects such as textures */
|
||||||
public class VKLoader
|
public class VKLoader
|
||||||
|
|
|
@ -1,21 +1,65 @@
|
||||||
package com.github.hydos.ginger.engine.vulkan.utils;
|
package com.github.hydos.ginger.engine.vulkan.utils;
|
||||||
|
|
||||||
import static org.lwjgl.system.MemoryUtil.*;
|
import static org.lwjgl.system.MemoryUtil.memAllocLong;
|
||||||
import static org.lwjgl.util.shaderc.Shaderc.*;
|
import static org.lwjgl.system.MemoryUtil.memAllocPointer;
|
||||||
import static org.lwjgl.vulkan.EXTDebugReport.*;
|
import static org.lwjgl.system.MemoryUtil.memFree;
|
||||||
import static org.lwjgl.vulkan.KHRSurface.*;
|
import static org.lwjgl.system.MemoryUtil.memUTF8;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_anyhit_shader;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_closesthit_shader;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_compilation_status_success;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_compile_into_spv;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_compile_options_initialize;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_compile_options_set_include_callbacks;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_compile_options_set_optimization_level;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_compiler_initialize;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_compiler_release;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_fragment_shader;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_miss_shader;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_optimization_level_performance;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_raygen_shader;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_result_get_bytes;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_result_get_compilation_status;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_result_get_error_message;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_result_get_length;
|
||||||
|
import static org.lwjgl.util.shaderc.Shaderc.shaderc_vertex_shader;
|
||||||
|
import static org.lwjgl.vulkan.EXTDebugReport.VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
|
||||||
|
import static org.lwjgl.vulkan.EXTDebugReport.vkCreateDebugReportCallbackEXT;
|
||||||
|
import static org.lwjgl.vulkan.KHRSurface.VK_ERROR_NATIVE_WINDOW_IN_USE_KHR;
|
||||||
|
import static org.lwjgl.vulkan.KHRSurface.VK_ERROR_SURFACE_LOST_KHR;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.*;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.LongBuffer;
|
||||||
|
|
||||||
import org.lwjgl.*;
|
import org.lwjgl.BufferUtils;
|
||||||
|
import org.lwjgl.PointerBuffer;
|
||||||
import org.lwjgl.system.MemoryStack;
|
import org.lwjgl.system.MemoryStack;
|
||||||
import org.lwjgl.util.shaderc.*;
|
import org.lwjgl.util.shaderc.ShadercIncludeResolve;
|
||||||
import org.lwjgl.vulkan.*;
|
import org.lwjgl.util.shaderc.ShadercIncludeResult;
|
||||||
|
import org.lwjgl.util.shaderc.ShadercIncludeResultRelease;
|
||||||
|
import org.lwjgl.vulkan.EXTDebugReport;
|
||||||
|
import org.lwjgl.vulkan.KHRDisplaySwapchain;
|
||||||
|
import org.lwjgl.vulkan.KHRSwapchain;
|
||||||
|
import org.lwjgl.vulkan.NVRayTracing;
|
||||||
|
import org.lwjgl.vulkan.VK10;
|
||||||
|
import org.lwjgl.vulkan.VK12;
|
||||||
|
import org.lwjgl.vulkan.VkClearValue;
|
||||||
|
import org.lwjgl.vulkan.VkCommandBuffer;
|
||||||
|
import org.lwjgl.vulkan.VkCommandBufferAllocateInfo;
|
||||||
|
import org.lwjgl.vulkan.VkCommandBufferBeginInfo;
|
||||||
|
import org.lwjgl.vulkan.VkDebugReportCallbackCreateInfoEXT;
|
||||||
|
import org.lwjgl.vulkan.VkDebugReportCallbackEXT;
|
||||||
|
import org.lwjgl.vulkan.VkDevice;
|
||||||
|
import org.lwjgl.vulkan.VkInstance;
|
||||||
|
import org.lwjgl.vulkan.VkRect2D;
|
||||||
|
import org.lwjgl.vulkan.VkRenderPassBeginInfo;
|
||||||
|
import org.lwjgl.vulkan.VkViewport;
|
||||||
|
|
||||||
import com.github.hydos.ginger.engine.common.tools.IOUtil;
|
import com.github.hydos.ginger.engine.common.tools.IOUtil;
|
||||||
|
import com.github.hydos.ginger.engine.vulkan.VKConstants;
|
||||||
|
import com.github.hydos.ginger.engine.vulkan.shaders.Pipeline;
|
||||||
|
|
||||||
/** @author hydos06
|
/** @author hydos
|
||||||
* a util library for Vulkan */
|
* a util library for Vulkan */
|
||||||
public class VKUtils
|
public class VKUtils
|
||||||
{
|
{
|
||||||
|
@ -164,12 +208,6 @@ public class VKUtils
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Pipeline
|
|
||||||
{
|
|
||||||
public long pipeline;
|
|
||||||
public long layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VkCommandBuffer[] initRenderCommandBuffers(VkDevice device, long commandPool, long[] framebuffers, long renderPass, int width, int height,
|
public static VkCommandBuffer[] initRenderCommandBuffers(VkDevice device, long commandPool, long[] framebuffers, long renderPass, int width, int height,
|
||||||
Pipeline pipeline, long descriptorSet, long verticesBuf)
|
Pipeline pipeline, long descriptorSet, long verticesBuf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,7 +12,12 @@ import static org.lwjgl.vulkan.VK10.*;
|
||||||
import org.lwjgl.system.MemoryStack;
|
import org.lwjgl.system.MemoryStack;
|
||||||
import org.lwjgl.util.vma.*;
|
import org.lwjgl.util.vma.*;
|
||||||
import org.lwjgl.vulkan.*;
|
import org.lwjgl.vulkan.*;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hydos
|
||||||
|
* used to make the vulkan api more readable
|
||||||
|
*
|
||||||
|
*/
|
||||||
public class VulkanFuncWrapper
|
public class VulkanFuncWrapper
|
||||||
{
|
{
|
||||||
public static VmaVulkanFunctions VmaVulkanFunctions(MemoryStack stack)
|
public static VmaVulkanFunctions VmaVulkanFunctions(MemoryStack stack)
|
||||||
|
|
Loading…
Reference in New Issue