1
0

memory stuff

This commit is contained in:
Niklas Birk 2020-03-20 16:33:43 +01:00
parent 29e3ac0d53
commit 0815c8a5f2
9 changed files with 197 additions and 36 deletions

View File

@ -22,12 +22,10 @@ configure_file(./shaders/vulkan/FragmentShader.frag ./vulkan/FragmentShader.frag
configure_file(./shaders/vulkan/runCompiler.bat ./vulkan/runCompiler.bat COPYONLY) configure_file(./shaders/vulkan/runCompiler.bat ./vulkan/runCompiler.bat COPYONLY)
execute_process(COMMAND runCompiler.bat WORKING_DIRECTORY ./vulkan) execute_process(COMMAND runCompiler.bat WORKING_DIRECTORY ./vulkan)
# Vulkan # Vulkan
find_package(Vulkan REQUIRED) find_package(Vulkan REQUIRED)
target_include_directories(${PROJECT_NAME} PUBLIC ${Vulkan_INCLUDE_DIRS}) target_include_directories(${PROJECT_NAME} PUBLIC ${Vulkan_INCLUDE_DIRS})
# GLFW # GLFW
include_directories(./glfw/include) include_directories(./glfw/include)
target_link_libraries(Informatikprojekt ${CMAKE_SOURCE_DIR}/glfw/lib-mingw-w64/libglfw3.a) target_link_libraries(Informatikprojekt ${CMAKE_SOURCE_DIR}/glfw/lib-mingw-w64/libglfw3.a)

View File

@ -2,7 +2,7 @@
#include "initOpenGL.h" #include "initOpenGL.h"
#include "utils.h" #include "utils.h"
#define PARTICLE_AMOUNT 1000 #define PARTICLE_AMOUNT 10000
void calcPos(particle *p, float dt); void calcPos(particle *p, float dt);
void calcCol(particle *p); void calcCol(particle *p);

View File

@ -63,19 +63,6 @@ void framebufferSizeCallback(GLFWwindow *window, int width, int height)
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
} }
void initVertexBufferObject(unsigned int *VBO, float *vertices)
{
glGenBuffers(1, VBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, *VBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW);
}
void initVertexArrayBuffer(unsigned int *VAO)
{
glGenVertexArrays(1, VAO);
glBindVertexArray(*VAO);
}
GLuint compileShader(const GLchar *shaderSource, GLenum shaderType) GLuint compileShader(const GLchar *shaderSource, GLenum shaderType)
{ {
GLuint shader; GLuint shader;

View File

@ -18,9 +18,6 @@ void terminateGLFW(GLFWwindow *window);
void errorCallback(int error, const char* description); void errorCallback(int error, const char* description);
void framebufferSizeCallback(GLFWwindow *window, int width, int height); void framebufferSizeCallback(GLFWwindow *window, int width, int height);
void initVertexBufferObject(unsigned int *VBO, float *vertices);
void initVertexArrayBuffer(unsigned int *VAO);
GLuint compileShader(const GLchar *shaderSource, GLenum shaderType); GLuint compileShader(const GLchar *shaderSource, GLenum shaderType);
GLuint linkShaders(GLuint *shaders, GLsizei count); GLuint linkShaders(GLuint *shaders, GLsizei count);
void deleteShaders(GLuint *shaders, GLsizei count); void deleteShaders(GLuint *shaders, GLsizei count);

View File

@ -190,20 +190,133 @@ void createAttachmentDescription(VkAttachmentDescription *attachmentDescription)
attachmentDescription->finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; attachmentDescription->finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
} }
void createAttachmentReference(VkAttachmentReference *attachmentReference, uint32_t attachment)
{
attachmentReference->attachment = attachment;
attachmentReference->layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
}
void createSubpassDescription(VkSubpassDescription *subpassDescription, VkPipelineBindPoint bindPoint,
VkAttachmentReference *attachmentReference)
{
subpassDescription->flags = 0;
subpassDescription->pipelineBindPoint = bindPoint;
subpassDescription->inputAttachmentCount = 0;
subpassDescription->pInputAttachments = NULL;
subpassDescription->colorAttachmentCount = 1;
subpassDescription->pColorAttachments = attachmentReference;
subpassDescription->pResolveAttachments = NULL;
subpassDescription->pDepthStencilAttachment = NULL;
subpassDescription->preserveAttachmentCount = 0;
subpassDescription->pPreserveAttachments = NULL;
}
void createRenderPassInfo(VkRenderPassCreateInfo *renderPassInfo, VkAttachmentDescription *attachmentDescriptions, VkSubpassDescription *subpassDescriptions)
{
renderPassInfo->sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderPassInfo->pNext = NULL;
renderPassInfo->flags = 0;
renderPassInfo->attachmentCount = 1;
renderPassInfo->pAttachments = attachmentDescriptions;
renderPassInfo->subpassCount = 1;
renderPassInfo->pSubpasses = subpassDescriptions;
renderPassInfo->dependencyCount = 0;
renderPassInfo->pDependencies = NULL;
}
void createGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo *graphicsPipelineInfo,
VkPipelineShaderStageCreateInfo *shaderStages,
VkPipelineVertexInputStateCreateInfo *vertexInputState,
VkPipelineInputAssemblyStateCreateInfo *inputAssemblyState,
VkPipelineViewportStateCreateInfo *viewportState,
VkPipelineRasterizationStateCreateInfo *rasterizationState,
VkPipelineMultisampleStateCreateInfo *multisampleState,
VkPipelineColorBlendStateCreateInfo *colorBlendState, VkPipelineLayout *pipelineLayout,
VkRenderPass *renderPass)
{
graphicsPipelineInfo->sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
graphicsPipelineInfo->pNext = NULL;
graphicsPipelineInfo->flags = 0;
graphicsPipelineInfo->stageCount = 3;
graphicsPipelineInfo->pStages = shaderStages;
graphicsPipelineInfo->pVertexInputState = vertexInputState;
graphicsPipelineInfo->pInputAssemblyState = inputAssemblyState;
graphicsPipelineInfo->pTessellationState = NULL;
graphicsPipelineInfo->pViewportState = viewportState;
graphicsPipelineInfo->pRasterizationState = rasterizationState;
graphicsPipelineInfo->pMultisampleState = multisampleState;
graphicsPipelineInfo->pDepthStencilState = NULL;
graphicsPipelineInfo->pColorBlendState = colorBlendState;
graphicsPipelineInfo->pDynamicState = NULL;
graphicsPipelineInfo->layout = *pipelineLayout;
graphicsPipelineInfo->renderPass = *renderPass;
graphicsPipelineInfo->subpass = 0;
graphicsPipelineInfo->basePipelineHandle = VK_NULL_HANDLE;
graphicsPipelineInfo->basePipelineIndex = -1;
}
void createFramebufferInfo(VkFramebufferCreateInfo *framebufferInfo, VkRenderPass *renderPass, VkImageView *imageView)
{
framebufferInfo->sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo->pNext = NULL;
framebufferInfo->flags = 0;
framebufferInfo->renderPass = *renderPass;
framebufferInfo->attachmentCount = 1;
framebufferInfo->pAttachments = imageView;
framebufferInfo->width = WIDTH;
framebufferInfo->height = HEIGHT;
framebufferInfo->layers = 1;
}
void createCommandPoolInfo(VkCommandPoolCreateInfo *commandPoolInfo, uint32_t queueFamilyIndex)
{
commandPoolInfo->sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
commandPoolInfo->pNext = NULL;
commandPoolInfo->flags = 0;
commandPoolInfo->queueFamilyIndex = queueFamilyIndex;
}
void createCommandBufferAllocateInfo(VkCommandBufferAllocateInfo *commandBufferAllocateInfo)
{
}
void shutdownVulkan(VkInstance *vkInstance, VkDevice *device, VkSurfaceKHR *surface, VkSwapchainKHR *swapChain, void shutdownVulkan(VkInstance *vkInstance, VkDevice *device, VkSurfaceKHR *surface, VkSwapchainKHR *swapChain,
VkImageView *imageViews, uint32_t imagesSize, VkShaderModule *modules, uint32_t shaderModulesSize, VkImageView *imageViews, uint32_t imageViewsSize, VkShaderModule *modules,
VkPipelineLayout *pipelineLayout) uint32_t shaderModulesSize, VkPipelineLayout *pipelineLayouts, uint32_t pipelineLayoutsSize,
VkRenderPass *renderPasses, uint32_t renderPassesSize, VkPipeline *pipelines,
uint32_t pipelinesSize, VkFramebuffer *framebuffers, VkCommandPool *commandPool)
{ {
vkDeviceWaitIdle(*device); vkDeviceWaitIdle(*device);
vkDestroyPipelineLayout(*device, *pipelineLayout, NULL); vkDestroyCommandPool(*device, *commandPool, NULL);
for (int i = 0; i < imageViewsSize; ++i)
{
vkDestroyFramebuffer(*device, framebuffers[i], NULL);
}
for (int i = 0; i < pipelinesSize; ++i)
{
vkDestroyPipeline(*device, pipelines[i], NULL);
}
for (int i = 0; i < renderPassesSize; ++i)
{
vkDestroyRenderPass(*device, renderPasses[i], NULL);
}
for (int i = 0; i < pipelineLayoutsSize; ++i)
{
vkDestroyPipelineLayout(*device, pipelineLayouts[i], NULL);
}
for (int i = 0; i < shaderModulesSize; ++i) for (int i = 0; i < shaderModulesSize; ++i)
{ {
vkDestroyShaderModule(*device, modules[i], NULL); vkDestroyShaderModule(*device, modules[i], NULL);
} }
for (int i = 0; i < imagesSize; i++) for (int i = 0; i < imageViewsSize; i++)
{ {
vkDestroyImageView(*device, imageViews[i], NULL); vkDestroyImageView(*device, imageViews[i], NULL);
} }

View File

@ -48,8 +48,26 @@ void createColorBlendStateInfo(VkPipelineColorBlendStateCreateInfo *colorBlendS
VkPipelineColorBlendAttachmentState *blendAttachments, uint32_t blendAttachmentsSize); VkPipelineColorBlendAttachmentState *blendAttachments, uint32_t blendAttachmentsSize);
void createLayoutInfo(VkPipelineLayoutCreateInfo *layoutInfo, VkDescriptorSetLayout *setLayouts, uint32_t setLayoutSize); void createLayoutInfo(VkPipelineLayoutCreateInfo *layoutInfo, VkDescriptorSetLayout *setLayouts, uint32_t setLayoutSize);
void createAttachmentDescription(VkAttachmentDescription *attachmentDescription); void createAttachmentDescription(VkAttachmentDescription *attachmentDescription);
void createAttachmentReference(VkAttachmentReference *attachmentReference, uint32_t attachment);
void createSubpassDescription(VkSubpassDescription *subpassDescription, VkPipelineBindPoint bindPoint,
VkAttachmentReference *attachmentReference);
void createRenderPassInfo(VkRenderPassCreateInfo *renderPassInfo, VkAttachmentDescription *attachmentDescriptions,
VkSubpassDescription *subpassDescriptions);
void createGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo *graphicsPipelineInfo,
VkPipelineShaderStageCreateInfo *shaderStages,
VkPipelineVertexInputStateCreateInfo *vertexInputState,
VkPipelineInputAssemblyStateCreateInfo *inputAssemblyState,
VkPipelineViewportStateCreateInfo *viewportState,
VkPipelineRasterizationStateCreateInfo *rasterizationState,
VkPipelineMultisampleStateCreateInfo *multisampleState,
VkPipelineColorBlendStateCreateInfo *colorBlendState, VkPipelineLayout *pipelineLayout,
VkRenderPass *renderPass);
void createFramebufferInfo(VkFramebufferCreateInfo *framebufferInfo, VkRenderPass *renderPass, VkImageView *imageView);
void createCommandPoolInfo(VkCommandPoolCreateInfo *commandPoolInfo, uint32_t queueFamilyIndex);
void shutdownVulkan(VkInstance *vkInstance, VkDevice *device, VkSurfaceKHR *surface, VkSwapchainKHR *swapChain, void shutdownVulkan(VkInstance *vkInstance, VkDevice *device, VkSurfaceKHR *surface, VkSwapchainKHR *swapChain,
VkImageView *imageViews, uint32_t imagesSize, VkShaderModule *modules, uint32_t shaderModulesSize, VkImageView *imageViews, uint32_t imageViewsSize, VkShaderModule *modules,
VkPipelineLayout *pipelineLayout); uint32_t shaderModulesSize, VkPipelineLayout *pipelineLayouts, uint32_t pipelineLayoutsSize,
VkRenderPass *renderPasses, uint32_t renderPassesSize, VkPipeline *pipelines,
uint32_t pipelinesSize, VkFramebuffer *framebuffers, VkCommandPool *commandPool);
void shutdownGLFW(GLFWwindow *window); void shutdownGLFW(GLFWwindow *window);
void printStats(VkPhysicalDevice *physicalDevice, VkSurfaceKHR *surface); void printStats(VkPhysicalDevice *physicalDevice, VkSurfaceKHR *surface);

View File

@ -1,8 +1,9 @@
#include <malloc.h>
#include "particlesystem.h" #include "particlesystem.h"
#include "initOpenGL.h" #include "initOpenGL.h"
#include "utils.h" #include "utils.h"
#define PARTICLE_AMOUNT 1000000 #define PARTICLE_AMOUNT 10000000
int main() int main()
{ {
@ -49,6 +50,7 @@ int main()
GLuint renderShaderProgram = linkShaders(renderShaders, 2); GLuint renderShaderProgram = linkShaders(renderShaders, 2);
float *particles = serializeParticlesystem(ps); float *particles = serializeParticlesystem(ps);
freeParticleSystem(ps);
GLsizeiptr sizeOfParticle = 3 * sizeof(vector3f) + sizeof(float); GLsizeiptr sizeOfParticle = 3 * sizeof(vector3f) + sizeof(float);
GLuint particleBuffer; GLuint particleBuffer;
@ -58,6 +60,8 @@ int main()
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, particleBuffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, particleBuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
free(particles);
GLuint vertexArray; GLuint vertexArray;
glGenVertexArrays(1, &vertexArray); glGenVertexArrays(1, &vertexArray);
glBindVertexArray(vertexArray); glBindVertexArray(vertexArray);
@ -99,10 +103,11 @@ int main()
//END //END
deleteShaders(renderShaders, 2); deleteShaders(renderShaders, 2);
glDeleteProgram(renderShaderProgram);
deleteShaders(computeShaders, 1); deleteShaders(computeShaders, 1);
glDeleteProgram(computeShaderProgram);
glDeleteBuffers(1, &particleBuffer);
terminateGLFW(window); terminateGLFW(window);
freeParticleSystem(ps);
return 0; return 0;
} }

View File

@ -1,3 +1,3 @@
D:\Programme\VulkanSDK\1.1.106.0\Bin\glslangValidator.exe -V ComputeShader.comp D:\Programme\VulkanSDK\1.2.131.2\Bin\glslangValidator.exe -V ComputeShader.comp
D:\Programme\VulkanSDK\1.1.106.0\Bin\glslangValidator.exe -V VertexShader.vert D:\Programme\VulkanSDK\1.2.131.2\Bin\glslangValidator.exe -V VertexShader.vert
D:\Programme\VulkanSDK\1.1.106.0\Bin\glslangValidator.exe -V FragmentShader.frag D:\Programme\VulkanSDK\1.2.131.2\Bin\glslangValidator.exe -V FragmentShader.frag

View File

@ -4,7 +4,7 @@
#include "initVulkan.h" #include "initVulkan.h"
#include "particlesystem.h" #include "particlesystem.h"
#define PARTICLE_AMOUNT 100 #define PARTICLE_AMOUNT 0
int main() int main()
{ {
@ -13,8 +13,12 @@ int main()
VkSurfaceKHR surface; VkSurfaceKHR surface;
VkSwapchainKHR swapChain; VkSwapchainKHR swapChain;
VkImageView *imageViews = NULL; VkImageView *imageViews = NULL;
uint32_t amountImages; uint32_t imageViewsSize;
VkPipelineLayout pipelineLayout; VkPipelineLayout pipelineLayout;
VkRenderPass renderPass;
VkPipeline pipeline;
VkFramebuffer *framebuffers;
VkCommandPool commandPool;
/************* INIT *************/ /************* INIT *************/
// GLFW // GLFW
@ -24,7 +28,7 @@ int main()
GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "Informatikprojekt - Vulkan", NULL, NULL); GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "Informatikprojekt - Vulkan", NULL, NULL);
// Init Vulkan // Init Vulkan
ASSERT_SUCCESS(initVulkan(&vkInstance, &device, &surface, window, &swapChain, &imageViews, &amountImages)) ASSERT_SUCCESS(initVulkan(&vkInstance, &device, &surface, window, &swapChain, &imageViews, &imageViewsSize))
/************* PARTICLE SYSTEM *************/ /************* PARTICLE SYSTEM *************/
vector3f *epos1 = initVector3f(0, 0, 0); vector3f *epos1 = initVector3f(0, 0, 0);
@ -89,19 +93,58 @@ int main()
createLayoutInfo(&layoutInfo, NULL, 0); createLayoutInfo(&layoutInfo, NULL, 0);
ASSERT_VK_SUCCESS(vkCreatePipelineLayout(device, &layoutInfo, NULL, &pipelineLayout)) ASSERT_VK_SUCCESS(vkCreatePipelineLayout(device, &layoutInfo, NULL, &pipelineLayout))
// Attachments
VkAttachmentDescription attachmentDescription; VkAttachmentDescription attachmentDescription;
createAttachmentDescription(&attachmentDescription); createAttachmentDescription(&attachmentDescription);
VkAttachmentReference attachmentReference;
createAttachmentReference(&attachmentReference, 0);
// Subpasses
VkSubpassDescription subpassDescription;
createSubpassDescription(&subpassDescription, VK_PIPELINE_BIND_POINT_GRAPHICS, &attachmentReference);
// Renderpass
VkRenderPassCreateInfo renderPassInfo;
createRenderPassInfo(&renderPassInfo, &attachmentDescription, &subpassDescription);
ASSERT_VK_SUCCESS(vkCreateRenderPass(device, &renderPassInfo, NULL, &renderPass))
// Graphics pipeline
VkGraphicsPipelineCreateInfo graphicsPipelineInfo;
createGraphicsPipelineInfo(&graphicsPipelineInfo, shaderStages, &vertexInputStateInfo, &inputAssemblyStateInfo,
&viewportStateInfo, &rasterizationStateInfo, &multisampleStateInfo, &colorBlendStateInfo,
&pipelineLayout, &renderPass);
ASSERT_VK_SUCCESS(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &graphicsPipelineInfo, NULL, &pipeline))
// Framebuffers
framebuffers = malloc(imageViewsSize * sizeof(VkFramebuffer));
for (int i = 0; i < imageViewsSize; ++i)
{
VkFramebufferCreateInfo framebufferInfo;
createFramebufferInfo(&framebufferInfo, &renderPass, &imageViews[i]);
ASSERT_VK_SUCCESS(vkCreateFramebuffer(device, &framebufferInfo, NULL, &framebuffers[i]))
}
// Command pool
VkCommandPoolCreateInfo commandPoolInfo;
createCommandPoolInfo(&commandPoolInfo, 0);
ASSERT_VK_SUCCESS(vkCreateCommandPool(device, &commandPoolInfo, NULL, &commandPool))
// Allocate info
VkCommandBufferAllocateInfo commandBufferAllocateInfo;
/************* RENDER LOOP *************/ /************* RENDER LOOP *************/
while (!glfwWindowShouldClose(window)) while (!glfwWindowShouldClose(window))
{ {
glfwPollEvents(); glfwPollEvents();
} }
// Shutdown Vulkan // Shutdown Vulkan
VkShaderModule modules[3] = { computeShaderModule, vertexShaderModule, fragmentShaderModule }; VkShaderModule modules[3] = { computeShaderModule, vertexShaderModule, fragmentShaderModule };
shutdownVulkan(&vkInstance, &device, &surface, &swapChain, imageViews, amountImages, modules, 3, &pipelineLayout); shutdownVulkan(&vkInstance, &device, &surface, &swapChain, imageViews, imageViewsSize, modules, 3, &pipelineLayout,
1,
&renderPass, 1, &pipeline, 1, framebuffers, &commandPool);
// Shutdown GLFW // Shutdown GLFW
shutdownGLFW(window); shutdownGLFW(window);