static everything and moved all Swapchain stuff into SwapchainManager

liteCraft
hYdos 2020-03-05 18:22:54 +10:00
parent 224a525565
commit 0497e553f1
6 changed files with 241 additions and 208 deletions

View File

@ -29,7 +29,8 @@ 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.misc.*; import com.github.hydos.ginger.engine.vulkan.misc.*;
import com.github.hydos.ginger.engine.vulkan.misc.ModelLoader.Model; import com.github.hydos.ginger.engine.vulkan.misc.ModelLoader.Model;
import com.github.hydos.ginger.engine.vulkan.pipelines.PipelineManager; import com.github.hydos.ginger.engine.vulkan.pipelines.VKPipelineManager;
import com.github.hydos.ginger.engine.vulkan.swapchain.VKSwapchainManager;
public class VulkanLitecraft { public class VulkanLitecraft {
@ -85,11 +86,11 @@ public class VulkanLitecraft {
} }
private class QueueFamilyIndices { public static class QueueFamilyIndices {
// We use Integer to use null as the empty value // We use Integer to use null as the empty value
private Integer graphicsFamily; public Integer graphicsFamily;
private Integer presentFamily; public Integer presentFamily;
private boolean isComplete() { private boolean isComplete() {
return graphicsFamily != null && presentFamily != null; return graphicsFamily != null && presentFamily != null;
@ -100,11 +101,11 @@ public class VulkanLitecraft {
} }
} }
private class SwapChainSupportDetails { public static class SwapChainSupportDetails {
private VkSurfaceCapabilitiesKHR capabilities; public VkSurfaceCapabilitiesKHR capabilities;
private VkSurfaceFormatKHR.Buffer formats; public VkSurfaceFormatKHR.Buffer formats;
private IntBuffer presentModes; public IntBuffer presentModes;
} }
@ -187,56 +188,56 @@ public class VulkanLitecraft {
private VkInstance instance; private VkInstance instance;
private long debugMessenger; private long debugMessenger;
private long surface; public static long surface;
private VkPhysicalDevice physicalDevice; public static VkPhysicalDevice physicalDevice;
public static int msaaSamples = VK_SAMPLE_COUNT_1_BIT; public static int msaaSamples = VK_SAMPLE_COUNT_1_BIT;
public static VkDevice device; public static VkDevice device;
private VkQueue graphicsQueue; private static VkQueue graphicsQueue;
private VkQueue presentQueue; private VkQueue presentQueue;
private long swapChain; public static long swapChain;
private List<Long> swapChainImages; public static List<Long> swapChainImages;
private int swapChainImageFormat; public static int swapChainImageFormat;
public static VkExtent2D swapChainExtent; public static VkExtent2D swapChainExtent;
private List<Long> swapChainImageViews; public static List<Long> swapChainImageViews;
private List<Long> swapChainFramebuffers; public static List<Long> swapChainFramebuffers;
public static long renderPass; public static long renderPass;
private long descriptorPool; public static long descriptorPool;
public static long descriptorSetLayout; public static long descriptorSetLayout;
private List<Long> descriptorSets; private static List<Long> descriptorSets;
public static long pipelineLayout; public static long pipelineLayout;
public static long graphicsPipeline; public static long graphicsPipeline;
private long commandPool; public static long commandPool;
private long colorImage; public static long colorImage;
private long colorImageMemory; public static long colorImageMemory;
private long colorImageView; public static long colorImageView;
private long depthImage; public static long depthImage;
private long depthImageMemory; public static long depthImageMemory;
private long depthImageView; public static long depthImageView;
private int mipLevels; private int mipLevels;
private long textureImage; private long textureImage;
private long textureImageMemory; private long textureImageMemory;
private long textureImageView; private static long textureImageView;
private long textureSampler; private static long textureSampler;
private Vertex[] vertices; private Vertex[] vertices;
private int[] indices; public static int[] indices;
private long vertexBuffer; private static long vertexBuffer;
private long vertexBufferMemory; private long vertexBufferMemory;
private long indexBuffer; private static long indexBuffer;
private long indexBufferMemory; private long indexBufferMemory;
private List<Long> uniformBuffers; public static List<Long> uniformBuffers;
private List<Long> uniformBuffersMemory; public static List<Long> uniformBuffersMemory;
private List<VkCommandBuffer> commandBuffers; public static List<VkCommandBuffer> commandBuffers;
private List<Frame> inFlightFrames; private List<Frame> inFlightFrames;
private Map<Integer, Frame> imagesInFlight; private Map<Integer, Frame> imagesInFlight;
@ -278,7 +279,7 @@ public class VulkanLitecraft {
createVertexBuffer(); createVertexBuffer();
createIndexBuffer(); createIndexBuffer();
createDescriptorSetLayout(); createDescriptorSetLayout();
createSwapChainObjects(); VKSwapchainManager.createSwapChainObjects();
createSyncObjects(); createSyncObjects();
} }
@ -295,39 +296,9 @@ public class VulkanLitecraft {
vkDeviceWaitIdle(device); vkDeviceWaitIdle(device);
} }
private void cleanupSwapChain() {
vkDestroyImageView(device, colorImageView, null);
vkDestroyImage(device, colorImage, null);
vkFreeMemory(device, colorImageMemory, null);
vkDestroyImageView(device, depthImageView, null);
vkDestroyImage(device, depthImage, null);
vkFreeMemory(device, depthImageMemory, null);
uniformBuffers.forEach(ubo -> vkDestroyBuffer(device, ubo, null));
uniformBuffersMemory.forEach(uboMemory -> vkFreeMemory(device, uboMemory, null));
vkDestroyDescriptorPool(device, descriptorPool, null);
swapChainFramebuffers.forEach(framebuffer -> vkDestroyFramebuffer(device, framebuffer, null));
vkFreeCommandBuffers(device, commandPool, asPointerBuffer(commandBuffers));
vkDestroyPipeline(device, graphicsPipeline, null);
vkDestroyPipelineLayout(device, pipelineLayout, null);
vkDestroyRenderPass(device, renderPass, null);
swapChainImageViews.forEach(imageView -> vkDestroyImageView(device, imageView, null));
vkDestroySwapchainKHR(device, swapChain, null);
}
private void cleanup() { private void cleanup() {
cleanupSwapChain(); VKSwapchainManager.cleanupSwapChain();
vkDestroySampler(device, textureSampler, null); vkDestroySampler(device, textureSampler, null);
vkDestroyImageView(device, textureImageView, null); vkDestroyImageView(device, textureImageView, null);
@ -367,40 +338,6 @@ public class VulkanLitecraft {
glfwTerminate(); glfwTerminate();
} }
private void recreateSwapChain() {
try(MemoryStack stack = stackPush()) {
IntBuffer width = stack.ints(0);
IntBuffer height = stack.ints(0);
while(width.get(0) == 0 && height.get(0) == 0) {
glfwGetFramebufferSize(Window.getWindow(), width, height);
glfwWaitEvents();
}
}
vkDeviceWaitIdle(device);
cleanupSwapChain();
createSwapChainObjects();
}
private void createSwapChainObjects() {
createSwapChain();
createImageViews();
createRenderPass();
PipelineManager.createGraphicsPipeline();
createColorResources();
createDepthResources();
createFramebuffers();
createUniformBuffers();
createDescriptorPool();
createDescriptorSets();
createCommandBuffers();
}
private void createInstance() { private void createInstance() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -575,77 +512,7 @@ public class VulkanLitecraft {
} }
} }
private void createSwapChain() { public static void createImageViews() {
try(MemoryStack stack = stackPush()) {
SwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalDevice, stack);
VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats);
int presentMode = chooseSwapPresentMode(swapChainSupport.presentModes);
VkExtent2D extent = chooseSwapExtent(swapChainSupport.capabilities);
IntBuffer imageCount = stack.ints(swapChainSupport.capabilities.minImageCount() + 1);
if(swapChainSupport.capabilities.maxImageCount() > 0 && imageCount.get(0) > swapChainSupport.capabilities.maxImageCount()) {
imageCount.put(0, swapChainSupport.capabilities.maxImageCount());
}
VkSwapchainCreateInfoKHR createInfo = VkSwapchainCreateInfoKHR.callocStack(stack);
createInfo.sType(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR);
createInfo.surface(surface);
// Image settings
createInfo.minImageCount(imageCount.get(0));
createInfo.imageFormat(surfaceFormat.format());
createInfo.imageColorSpace(surfaceFormat.colorSpace());
createInfo.imageExtent(extent);
createInfo.imageArrayLayers(1);
createInfo.imageUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
if(!indices.graphicsFamily.equals(indices.presentFamily)) {
createInfo.imageSharingMode(VK_SHARING_MODE_CONCURRENT);
createInfo.pQueueFamilyIndices(stack.ints(indices.graphicsFamily, indices.presentFamily));
} else {
createInfo.imageSharingMode(VK_SHARING_MODE_EXCLUSIVE);
}
createInfo.preTransform(swapChainSupport.capabilities.currentTransform());
createInfo.compositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR);
createInfo.presentMode(presentMode);
createInfo.clipped(true);
createInfo.oldSwapchain(VK_NULL_HANDLE);
LongBuffer pSwapChain = stack.longs(VK_NULL_HANDLE);
if(vkCreateSwapchainKHR(device, createInfo, null, pSwapChain) != VK_SUCCESS) {
throw new RuntimeException("Failed to create swap chain");
}
swapChain = pSwapChain.get(0);
vkGetSwapchainImagesKHR(device, swapChain, imageCount, null);
LongBuffer pSwapchainImages = stack.mallocLong(imageCount.get(0));
vkGetSwapchainImagesKHR(device, swapChain, imageCount, pSwapchainImages);
swapChainImages = new ArrayList<>(imageCount.get(0));
for(int i = 0;i < pSwapchainImages.capacity();i++) {
swapChainImages.add(pSwapchainImages.get(i));
}
swapChainImageFormat = surfaceFormat.format();
swapChainExtent = VkExtent2D.create().set(extent);
}
}
private void createImageViews() {
swapChainImageViews = new ArrayList<>(swapChainImages.size()); swapChainImageViews = new ArrayList<>(swapChainImages.size());
@ -654,7 +521,7 @@ public class VulkanLitecraft {
} }
} }
private void createRenderPass() { public static void createRenderPass() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -774,7 +641,7 @@ public class VulkanLitecraft {
} }
} }
private void createFramebuffers() { public static void createFramebuffers() {
swapChainFramebuffers = new ArrayList<>(swapChainImageViews.size()); swapChainFramebuffers = new ArrayList<>(swapChainImageViews.size());
@ -826,7 +693,7 @@ public class VulkanLitecraft {
} }
} }
private void createColorResources() { public static void createColorResources() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -852,7 +719,7 @@ public class VulkanLitecraft {
} }
} }
private void createDepthResources() { public static void createDepthResources() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -885,7 +752,7 @@ public class VulkanLitecraft {
} }
} }
private int findSupportedFormat(IntBuffer formatCandidates, int tiling, int features) { private static int findSupportedFormat(IntBuffer formatCandidates, int tiling, int features) {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -910,14 +777,14 @@ public class VulkanLitecraft {
} }
private int findDepthFormat() { private static int findDepthFormat() {
return findSupportedFormat( return findSupportedFormat(
stackGet().ints(VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT), stackGet().ints(VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT),
VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT); VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);
} }
private boolean hasStencilComponent(int format) { private static boolean hasStencilComponent(int format) {
return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT; return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
} }
@ -1162,7 +1029,7 @@ public class VulkanLitecraft {
} }
} }
private long createImageView(long image, int format, int aspectFlags, int mipLevels) { private static long createImageView(long image, int format, int aspectFlags, int mipLevels) {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1187,7 +1054,7 @@ public class VulkanLitecraft {
} }
} }
private void createImage(int width, int height, int mipLevels, int numSamples, int format, int tiling, int usage, int memProperties, private static void createImage(int width, int height, int mipLevels, int numSamples, int format, int tiling, int usage, int memProperties,
LongBuffer pTextureImage, LongBuffer pTextureImageMemory) { LongBuffer pTextureImage, LongBuffer pTextureImageMemory) {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1227,7 +1094,7 @@ public class VulkanLitecraft {
} }
} }
private void transitionImageLayout(long image, int format, int oldLayout, int newLayout, int mipLevels) { private static void transitionImageLayout(long image, int format, int oldLayout, int newLayout, int mipLevels) {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1446,7 +1313,7 @@ public class VulkanLitecraft {
} }
} }
private void createUniformBuffers() { public static void createUniformBuffers() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1471,7 +1338,7 @@ public class VulkanLitecraft {
} }
private void createDescriptorPool() { public static void createDescriptorPool() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1500,7 +1367,7 @@ public class VulkanLitecraft {
} }
} }
private void createDescriptorSets() { public static void createDescriptorSets() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1565,7 +1432,7 @@ public class VulkanLitecraft {
} }
} }
private void createBuffer(long size, int usage, int properties, LongBuffer pBuffer, LongBuffer pBufferMemory) { private static void createBuffer(long size, int usage, int properties, LongBuffer pBuffer, LongBuffer pBufferMemory) {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1595,7 +1462,7 @@ public class VulkanLitecraft {
} }
} }
private VkCommandBuffer beginSingleTimeCommands() { private static VkCommandBuffer beginSingleTimeCommands() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1619,7 +1486,7 @@ public class VulkanLitecraft {
} }
} }
private void endSingleTimeCommands(VkCommandBuffer commandBuffer) { private static void endSingleTimeCommands(VkCommandBuffer commandBuffer) {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
@ -1684,7 +1551,7 @@ public class VulkanLitecraft {
ubo.proj.get(AlignmentUtils.alignas(mat4Size * 2, AlignmentUtils.alignof(ubo.view)), buffer); ubo.proj.get(AlignmentUtils.alignas(mat4Size * 2, AlignmentUtils.alignof(ubo.view)), buffer);
} }
private int findMemoryType(int typeFilter, int properties) { private static int findMemoryType(int typeFilter, int properties) {
VkPhysicalDeviceMemoryProperties memProperties = VkPhysicalDeviceMemoryProperties.mallocStack(); VkPhysicalDeviceMemoryProperties memProperties = VkPhysicalDeviceMemoryProperties.mallocStack();
vkGetPhysicalDeviceMemoryProperties(physicalDevice, memProperties); vkGetPhysicalDeviceMemoryProperties(physicalDevice, memProperties);
@ -1698,7 +1565,7 @@ public class VulkanLitecraft {
throw new RuntimeException("Failed to find suitable memory type"); throw new RuntimeException("Failed to find suitable memory type");
} }
private void createCommandBuffers() { public static void createCommandBuffers() {
final int commandBuffersCount = swapChainFramebuffers.size(); final int commandBuffersCount = swapChainFramebuffers.size();
@ -1763,7 +1630,11 @@ public class VulkanLitecraft {
vkCmdBindIndexBuffer(commandBuffer, indexBuffer, 0, VK_INDEX_TYPE_UINT32); vkCmdBindIndexBuffer(commandBuffer, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
pipelineLayout, 0, stack.longs(descriptorSets.get(i)), null); pipelineLayout,
0, stack.longs(
descriptorSets.get(i)
),
null);
vkCmdDrawIndexed(commandBuffer, indices.length, 1, 0, 0, 0); vkCmdDrawIndexed(commandBuffer, indices.length, 1, 0, 0, 0);
} }
@ -1847,7 +1718,7 @@ public class VulkanLitecraft {
thisFrame.imageAvailableSemaphore(), VK_NULL_HANDLE, pImageIndex); thisFrame.imageAvailableSemaphore(), VK_NULL_HANDLE, pImageIndex);
if(vkResult == VK_ERROR_OUT_OF_DATE_KHR) { if(vkResult == VK_ERROR_OUT_OF_DATE_KHR) {
recreateSwapChain(); VKSwapchainManager.recreateSwapChain();
return; return;
} else if(vkResult != VK_SUCCESS) { } else if(vkResult != VK_SUCCESS) {
throw new RuntimeException("Cannot get image"); throw new RuntimeException("Cannot get image");
@ -1895,7 +1766,7 @@ public class VulkanLitecraft {
if(vkResult == VK_ERROR_OUT_OF_DATE_KHR || vkResult == VK_SUBOPTIMAL_KHR || framebufferResize) { if(vkResult == VK_ERROR_OUT_OF_DATE_KHR || vkResult == VK_SUBOPTIMAL_KHR || framebufferResize) {
framebufferResize = false; framebufferResize = false;
recreateSwapChain(); VKSwapchainManager.recreateSwapChain();
} else if(vkResult != VK_SUCCESS) { } else if(vkResult != VK_SUCCESS) {
throw new RuntimeException("Failed to present swap chain image"); throw new RuntimeException("Failed to present swap chain image");
} }
@ -1904,7 +1775,7 @@ public class VulkanLitecraft {
} }
} }
private VkSurfaceFormatKHR chooseSwapSurfaceFormat(VkSurfaceFormatKHR.Buffer availableFormats) { public static VkSurfaceFormatKHR chooseSwapSurfaceFormat(VkSurfaceFormatKHR.Buffer availableFormats) {
return availableFormats.stream() return availableFormats.stream()
.filter(availableFormat -> availableFormat.format() == VK_FORMAT_B8G8R8_SRGB) .filter(availableFormat -> availableFormat.format() == VK_FORMAT_B8G8R8_SRGB)
.filter(availableFormat -> availableFormat.colorSpace() == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) .filter(availableFormat -> availableFormat.colorSpace() == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
@ -1912,7 +1783,7 @@ public class VulkanLitecraft {
.orElse(availableFormats.get(0)); .orElse(availableFormats.get(0));
} }
private int chooseSwapPresentMode(IntBuffer availablePresentModes) { public static int chooseSwapPresentMode(IntBuffer availablePresentModes) {
for(int i = 0;i < availablePresentModes.capacity();i++) { for(int i = 0;i < availablePresentModes.capacity();i++) {
if(availablePresentModes.get(i) == VK_PRESENT_MODE_MAILBOX_KHR) { if(availablePresentModes.get(i) == VK_PRESENT_MODE_MAILBOX_KHR) {
@ -1923,7 +1794,7 @@ public class VulkanLitecraft {
return VK_PRESENT_MODE_FIFO_KHR; return VK_PRESENT_MODE_FIFO_KHR;
} }
private VkExtent2D chooseSwapExtent(VkSurfaceCapabilitiesKHR capabilities) { public static VkExtent2D chooseSwapExtent(VkSurfaceCapabilitiesKHR capabilities) {
if(capabilities.currentExtent().width() != UINT32_MAX) { if(capabilities.currentExtent().width() != UINT32_MAX) {
return capabilities.currentExtent(); return capabilities.currentExtent();
@ -1945,7 +1816,7 @@ public class VulkanLitecraft {
return actualExtent; return actualExtent;
} }
private int clamp(int min, int max, int value) { private static int clamp(int min, int max, int value) {
return Math.max(min, Math.min(max, value)); return Math.max(min, Math.min(max, value));
} }
@ -1984,7 +1855,7 @@ public class VulkanLitecraft {
} }
} }
private SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device, MemoryStack stack) { public static SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device, MemoryStack stack) {
SwapChainSupportDetails details = new SwapChainSupportDetails(); SwapChainSupportDetails details = new SwapChainSupportDetails();
@ -2010,7 +1881,7 @@ public class VulkanLitecraft {
return details; return details;
} }
private QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device) { public static QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device) {
QueueFamilyIndices indices = new QueueFamilyIndices(); QueueFamilyIndices indices = new QueueFamilyIndices();
@ -2056,7 +1927,7 @@ public class VulkanLitecraft {
return buffer.rewind(); return buffer.rewind();
} }
private PointerBuffer asPointerBuffer(List<? extends Pointer> list) { public static PointerBuffer asPointerBuffer(List<? extends Pointer> list) {
MemoryStack stack = stackGet(); MemoryStack stack = stackGet();

View File

@ -16,6 +16,7 @@ import java.util.logging.Logger;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static org.lwjgl.assimp.Assimp.*; import static org.lwjgl.assimp.Assimp.*;
@Deprecated
public class ModelLoader { public class ModelLoader {
public static Model loadModel(File file, int flags) { public static Model loadModel(File file, int flags) {

View File

@ -11,19 +11,19 @@ import org.lwjgl.vulkan.*;
import com.github.hydos.ginger.VulkanLitecraft; import com.github.hydos.ginger.VulkanLitecraft;
import com.github.hydos.ginger.VulkanLitecraft.VulkanDemoGinger2.Vertex; import com.github.hydos.ginger.VulkanLitecraft.VulkanDemoGinger2.Vertex;
import com.github.hydos.ginger.engine.vulkan.shaders.*; import com.github.hydos.ginger.engine.vulkan.shaders.*;
import com.github.hydos.ginger.engine.vulkan.shaders.SPIRVUtils.SPIRV; import com.github.hydos.ginger.engine.vulkan.shaders.VKShaderUtils.SPIRV;
public class PipelineManager public class VKPipelineManager
{ {
public static void createGraphicsPipeline() { public static void createGraphicsPipeline() {
try(MemoryStack stack = stackPush()) { try(MemoryStack stack = stackPush()) {
SPIRV vertShaderSPIRV = SPIRVUtils.compileShaderFile("vulkan/shaders/entity.vert", SPIRVUtils.ShaderType.VERTEX_SHADER); SPIRV vertShaderSPIRV = VKShaderUtils.compileShaderFile("vulkan/shaders/entity.vert", VKShaderUtils.ShaderType.VERTEX_SHADER);
SPIRV fragShaderSPIRV = SPIRVUtils.compileShaderFile("vulkan/shaders/entity.frag", SPIRVUtils.ShaderType.FRAGMENT_SHADER); SPIRV fragShaderSPIRV = VKShaderUtils.compileShaderFile("vulkan/shaders/entity.frag", VKShaderUtils.ShaderType.FRAGMENT_SHADER);
long vertShaderModule = ShaderManager.createShaderModule(vertShaderSPIRV.bytecode()); long vertShaderModule = VKShaderManager.createShaderModule(vertShaderSPIRV.bytecode());
long fragShaderModule = ShaderManager.createShaderModule(fragShaderSPIRV.bytecode()); long fragShaderModule = VKShaderManager.createShaderModule(fragShaderSPIRV.bytecode());
ByteBuffer entryPoint = stack.UTF8("main"); ByteBuffer entryPoint = stack.UTF8("main");
@ -102,8 +102,8 @@ public class PipelineManager
depthStencil.depthWriteEnable(true); depthStencil.depthWriteEnable(true);
depthStencil.depthCompareOp(VK_COMPARE_OP_LESS); depthStencil.depthCompareOp(VK_COMPARE_OP_LESS);
depthStencil.depthBoundsTestEnable(false); depthStencil.depthBoundsTestEnable(false);
depthStencil.minDepthBounds(0.0f); // Optional depthStencil.minDepthBounds(0.0f);
depthStencil.maxDepthBounds(1.0f); // Optional depthStencil.maxDepthBounds(1.0f);
depthStencil.stencilTestEnable(false); depthStencil.stencilTestEnable(false);
// COLOR BLENDING // COLOR BLENDING

View File

@ -15,7 +15,7 @@ import com.github.hydos.ginger.VulkanLitecraft;
* @author hydos * @author hydos
* *
*/ */
public class ShaderManager public class VKShaderManager
{ {
public static long createShaderModule(ByteBuffer spirvCode) { public static long createShaderModule(ByteBuffer spirvCode) {

View File

@ -13,7 +13,7 @@ import static java.lang.ClassLoader.getSystemClassLoader;
import static org.lwjgl.system.MemoryUtil.NULL; import static org.lwjgl.system.MemoryUtil.NULL;
import static org.lwjgl.util.shaderc.Shaderc.*; import static org.lwjgl.util.shaderc.Shaderc.*;
public class SPIRVUtils { public class VKShaderUtils {
public static SPIRV compileShaderFile(String shaderFile, ShaderType shaderKind) { public static SPIRV compileShaderFile(String shaderFile, ShaderType shaderKind) {
return compileShaderAbsoluteFile(getSystemClassLoader().getResource(shaderFile).toExternalForm(), shaderKind); return compileShaderAbsoluteFile(getSystemClassLoader().getResource(shaderFile).toExternalForm(), shaderKind);

View File

@ -0,0 +1,161 @@
package com.github.hydos.ginger.engine.vulkan.swapchain;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.system.MemoryStack.stackPush;
import static org.lwjgl.vulkan.KHRSurface.VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
import static org.lwjgl.vulkan.KHRSwapchain.*;
import static org.lwjgl.vulkan.VK10.*;
import java.nio.*;
import java.util.ArrayList;
import org.lwjgl.system.MemoryStack;
import org.lwjgl.vulkan.*;
import com.github.hydos.ginger.VulkanLitecraft.VulkanDemoGinger2;
import com.github.hydos.ginger.VulkanLitecraft.VulkanDemoGinger2.*;
import com.github.hydos.ginger.engine.common.io.Window;
import com.github.hydos.ginger.engine.vulkan.pipelines.VKPipelineManager;
public class VKSwapchainManager
{
public static void cleanupSwapChain() {
vkDestroyImageView(VulkanDemoGinger2.device, VulkanDemoGinger2.colorImageView, null);
vkDestroyImage(VulkanDemoGinger2.device, VulkanDemoGinger2.colorImage, null);
vkFreeMemory(VulkanDemoGinger2.device, VulkanDemoGinger2.colorImageMemory, null);
vkDestroyImageView(VulkanDemoGinger2.device, VulkanDemoGinger2.depthImageView, null);
vkDestroyImage(VulkanDemoGinger2.device, VulkanDemoGinger2.depthImage, null);
vkFreeMemory(VulkanDemoGinger2.device, VulkanDemoGinger2.depthImageMemory, null);
VulkanDemoGinger2.uniformBuffers.forEach(ubo -> vkDestroyBuffer(VulkanDemoGinger2.device, ubo, null));
VulkanDemoGinger2.uniformBuffersMemory.forEach(uboMemory -> vkFreeMemory(VulkanDemoGinger2.device, uboMemory, null));
vkDestroyDescriptorPool(VulkanDemoGinger2.device, VulkanDemoGinger2.descriptorPool, null);
VulkanDemoGinger2.swapChainFramebuffers.forEach(framebuffer -> vkDestroyFramebuffer(VulkanDemoGinger2.device, framebuffer, null));
vkFreeCommandBuffers(VulkanDemoGinger2.device, VulkanDemoGinger2.commandPool, VulkanDemoGinger2.asPointerBuffer(VulkanDemoGinger2.commandBuffers));
vkDestroyPipeline(VulkanDemoGinger2.device, VulkanDemoGinger2.graphicsPipeline, null);
vkDestroyPipelineLayout(VulkanDemoGinger2.device, VulkanDemoGinger2.pipelineLayout, null);
vkDestroyRenderPass(VulkanDemoGinger2.device, VulkanDemoGinger2.renderPass, null);
VulkanDemoGinger2.swapChainImageViews.forEach(imageView -> vkDestroyImageView(VulkanDemoGinger2.device, imageView, null));
vkDestroySwapchainKHR(VulkanDemoGinger2.device, VulkanDemoGinger2.swapChain, null);
}
public static void recreateSwapChain() {
try(MemoryStack stack = stackPush()) {
IntBuffer width = stack.ints(0);
IntBuffer height = stack.ints(0);
while(width.get(0) == 0 && height.get(0) == 0) {
glfwGetFramebufferSize(Window.getWindow(), width, height);
glfwWaitEvents();
}
}
vkDeviceWaitIdle(VulkanDemoGinger2.device);
VKSwapchainManager.cleanupSwapChain();
createSwapChainObjects();
}
public static void createSwapChain() {
try(MemoryStack stack = stackPush()) {
SwapChainSupportDetails swapChainSupport = VulkanDemoGinger2.querySwapChainSupport(VulkanDemoGinger2.physicalDevice, stack);
VkSurfaceFormatKHR surfaceFormat = VulkanDemoGinger2.chooseSwapSurfaceFormat(swapChainSupport.formats);
int presentMode = VulkanDemoGinger2.chooseSwapPresentMode(swapChainSupport.presentModes);
VkExtent2D extent = VulkanDemoGinger2.chooseSwapExtent(swapChainSupport.capabilities);
IntBuffer imageCount = stack.ints(swapChainSupport.capabilities.minImageCount() + 1);
if(swapChainSupport.capabilities.maxImageCount() > 0 && imageCount.get(0) > swapChainSupport.capabilities.maxImageCount()) {
imageCount.put(0, swapChainSupport.capabilities.maxImageCount());
}
VkSwapchainCreateInfoKHR createInfo = VkSwapchainCreateInfoKHR.callocStack(stack);
createInfo.sType(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR);
createInfo.surface(VulkanDemoGinger2.surface);
// Image settings
createInfo.minImageCount(imageCount.get(0));
createInfo.imageFormat(surfaceFormat.format());
createInfo.imageColorSpace(surfaceFormat.colorSpace());
createInfo.imageExtent(extent);
createInfo.imageArrayLayers(1);
createInfo.imageUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
QueueFamilyIndices indices = VulkanDemoGinger2.findQueueFamilies(VulkanDemoGinger2.physicalDevice);
if(!indices.graphicsFamily.equals(indices.presentFamily)) {
createInfo.imageSharingMode(VK_SHARING_MODE_CONCURRENT);
createInfo.pQueueFamilyIndices(stack.ints(indices.graphicsFamily, indices.presentFamily));
} else {
createInfo.imageSharingMode(VK_SHARING_MODE_EXCLUSIVE);
}
createInfo.preTransform(swapChainSupport.capabilities.currentTransform());
createInfo.compositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR);
createInfo.presentMode(presentMode);
createInfo.clipped(true);
createInfo.oldSwapchain(VK_NULL_HANDLE);
LongBuffer pSwapChain = stack.longs(VK_NULL_HANDLE);
if(vkCreateSwapchainKHR(VulkanDemoGinger2.device, createInfo, null, pSwapChain) != VK_SUCCESS) {
throw new RuntimeException("Failed to create swap chain");
}
VulkanDemoGinger2.swapChain = pSwapChain.get(0);
vkGetSwapchainImagesKHR(VulkanDemoGinger2.device, VulkanDemoGinger2.swapChain, imageCount, null);
LongBuffer pSwapchainImages = stack.mallocLong(imageCount.get(0));
vkGetSwapchainImagesKHR(VulkanDemoGinger2.device, VulkanDemoGinger2.swapChain, imageCount, pSwapchainImages);
VulkanDemoGinger2.swapChainImages = new ArrayList<>(imageCount.get(0));
for(int i = 0;i < pSwapchainImages.capacity();i++) {
VulkanDemoGinger2.swapChainImages.add(pSwapchainImages.get(i));
}
VulkanDemoGinger2.swapChainImageFormat = surfaceFormat.format();
VulkanDemoGinger2.swapChainExtent = VkExtent2D.create().set(extent);
}
}
/**
* i tried organising it but if i change the order everything breaks
*/
public static void createSwapChainObjects() {
createSwapChain();
VulkanDemoGinger2.createImageViews();
VulkanDemoGinger2.createRenderPass();
VKPipelineManager.createGraphicsPipeline();
VulkanDemoGinger2.createColorResources();
VulkanDemoGinger2.createDepthResources();
VulkanDemoGinger2.createFramebuffers();
VulkanDemoGinger2.createUniformBuffers();
VulkanDemoGinger2.createDescriptorPool();
VulkanDemoGinger2.createDescriptorSets();
VulkanDemoGinger2.createCommandBuffers();
}
}