|
|
|
@ -2,16 +2,14 @@
|
|
|
|
|
#include "gpu.h"
|
|
|
|
|
#include "vulkan/vulkan_core.h"
|
|
|
|
|
|
|
|
|
|
VkResult create_hex_pipeline(
|
|
|
|
|
VkDevice device,
|
|
|
|
|
VkRenderPass render_pass,
|
|
|
|
|
GraphicsPipeline* graphics,
|
|
|
|
|
ComputePipeline* compute) {
|
|
|
|
|
VkResult create_hex_context(
|
|
|
|
|
RenderContext* gpu,
|
|
|
|
|
HexContext* context) {
|
|
|
|
|
VkResult result;
|
|
|
|
|
|
|
|
|
|
// Compute Pipeline
|
|
|
|
|
|
|
|
|
|
VkShaderModule compute_shader = load_shader_file("shader/hex.comp.spv", device);
|
|
|
|
|
VkShaderModule compute_shader = load_shader_file("shader/hex.comp.spv", gpu->device);
|
|
|
|
|
if(compute_shader == VK_NULL_HANDLE) {
|
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
|
}
|
|
|
|
@ -35,20 +33,20 @@ VkResult create_hex_pipeline(
|
|
|
|
|
.pushConstantRangeCount = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
VK_RESULT(vkCreatePipelineLayout(device, &compute_layout_info, NULL, &compute->layout));
|
|
|
|
|
VK_RESULT(vkCreatePipelineLayout(gpu->device, &compute_layout_info, NULL, &context->compute.layout));
|
|
|
|
|
|
|
|
|
|
VkComputePipelineCreateInfo compute_pipeline_info = {
|
|
|
|
|
.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
|
|
|
|
|
.stage = compute_shader_stage,
|
|
|
|
|
.layout = compute->layout,
|
|
|
|
|
.layout = context->compute.layout,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
VK_RESULT(vkCreateComputePipelines(device, VK_NULL_HANDLE, 1, &compute_pipeline_info, NULL, &compute->pipeline));
|
|
|
|
|
VK_RESULT(vkCreateComputePipelines(gpu->device, VK_NULL_HANDLE, 1, &compute_pipeline_info, NULL, &context->compute.pipeline));
|
|
|
|
|
|
|
|
|
|
// Graphics Pipeline
|
|
|
|
|
|
|
|
|
|
VkShaderModule vert_shader = load_shader_file("shader/hex.vert.spv", device);
|
|
|
|
|
VkShaderModule frag_shader = load_shader_file("shader/hex.frag.spv", device);
|
|
|
|
|
VkShaderModule vert_shader = load_shader_file("shader/hex.vert.spv", gpu->device);
|
|
|
|
|
VkShaderModule frag_shader = load_shader_file("shader/hex.frag.spv", gpu->device);
|
|
|
|
|
|
|
|
|
|
VkPipelineShaderStageCreateInfo graphics_stages[] = {
|
|
|
|
|
{
|
|
|
|
@ -77,7 +75,7 @@ VkResult create_hex_pipeline(
|
|
|
|
|
.pushConstantRangeCount = 1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
VK_RESULT(vkCreatePipelineLayout(device, &graphics_layout_info, NULL, &graphics->layout));
|
|
|
|
|
VK_RESULT(vkCreatePipelineLayout(gpu->device, &graphics_layout_info, NULL, &context->graphics.layout));
|
|
|
|
|
|
|
|
|
|
VkPipelineVertexInputStateCreateInfo vertex_info = {
|
|
|
|
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
|
|
|
|
@ -180,7 +178,7 @@ VkResult create_hex_pipeline(
|
|
|
|
|
|
|
|
|
|
VkGraphicsPipelineCreateInfo graphics_pipeline_info = {
|
|
|
|
|
.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
|
|
|
|
|
.layout = graphics->layout,
|
|
|
|
|
.layout = context->graphics.layout,
|
|
|
|
|
.stageCount = sizeof(graphics_stages)/sizeof(VkPipelineShaderStageCreateInfo),
|
|
|
|
|
.pStages = graphics_stages,
|
|
|
|
|
.pVertexInputState = &vertex_info,
|
|
|
|
@ -191,13 +189,42 @@ VkResult create_hex_pipeline(
|
|
|
|
|
.pDynamicState = &dynamic_info,
|
|
|
|
|
.pMultisampleState = &multisample_info,
|
|
|
|
|
.pDepthStencilState = &depth_info,
|
|
|
|
|
.renderPass = render_pass,
|
|
|
|
|
.renderPass = gpu->render_pass,
|
|
|
|
|
.subpass = 0,
|
|
|
|
|
.basePipelineHandle = VK_NULL_HANDLE,
|
|
|
|
|
.basePipelineIndex = -1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
VK_RESULT(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &graphics_pipeline_info, NULL, &graphics->pipeline));
|
|
|
|
|
VK_RESULT(vkCreateGraphicsPipelines(gpu->device, VK_NULL_HANDLE, 1, &graphics_pipeline_info, NULL, &context->graphics.pipeline));
|
|
|
|
|
|
|
|
|
|
glm_perspective(30.0, (float)gpu->swapchain_extent.width/(float)gpu->swapchain_extent.height, 0.01, 99.9, context->data.proj);
|
|
|
|
|
glm_mat4_identity(context->data.view);
|
|
|
|
|
VK_RESULT(create_storage_buffer(
|
|
|
|
|
gpu->allocator,
|
|
|
|
|
0,
|
|
|
|
|
sizeof(GPUHexContext),
|
|
|
|
|
&context->context,
|
|
|
|
|
&context->context_memory));
|
|
|
|
|
context->address = buffer_address(gpu->device, context->context);
|
|
|
|
|
VK_RESULT(add_transfer(&context->data, context->context, 0, sizeof(GPUHexContext), gpu->current_frame, gpu));
|
|
|
|
|
|
|
|
|
|
return VK_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VkResult create_hex_region(uint32_t x, uint32_t y, HexRegion* region, RenderContext* gpu) {
|
|
|
|
|
VkResult result;
|
|
|
|
|
|
|
|
|
|
region->x = x;
|
|
|
|
|
region->y = y;
|
|
|
|
|
VK_RESULT(create_storage_buffer(
|
|
|
|
|
gpu->allocator,
|
|
|
|
|
0,
|
|
|
|
|
sizeof(GPUHexRegion),
|
|
|
|
|
®ion->region,
|
|
|
|
|
®ion->region_memory));
|
|
|
|
|
VK_RESULT(add_transfer(®ion->x, region->region, offsetof(GPUHexRegion, x), sizeof(uint32_t)*2, 0, gpu));
|
|
|
|
|
region->address = buffer_address(gpu->device, region->region);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return VK_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|