Run both pipelines in the render pass

main
noah metz 2024-01-10 16:27:21 -07:00
parent 406d2faf4c
commit f8b6b8e8f2
1 changed files with 146 additions and 15 deletions

@ -2081,14 +2081,14 @@ Object create_object(uint32_t max_frames_in_flight, uint32_t descriptor_count) {
return ret; return ret;
} }
Object create_renderable(Mesh* mesh, Material* material, VkDescriptorSet* descriptor_sets, uint32_t max_frames_in_flight, uint32_t descriptor_count) { Object create_renderable(Mesh* mesh, Material* material, uint32_t descriptor_sets_count, VkDescriptorSet* descriptor_sets, uint32_t max_frames_in_flight) {
Object zero = { Object zero = {
.attributes = { .attributes = {
.buckets = 0, .buckets = 0,
}, },
}; };
Object object = create_object(max_frames_in_flight, descriptor_count); Object object = create_object(max_frames_in_flight, descriptor_sets_count);
if(object.attributes.buckets == 0) { if(object.attributes.buckets == 0) {
return zero; return zero;
} }
@ -2327,16 +2327,45 @@ Material create_simple_mesh_material(VkDevice device, VkExtent2D extent, VkRende
.attributes_count = sizeof(attributes)/sizeof(VkVertexInputAttributeDescription), .attributes_count = sizeof(attributes)/sizeof(VkVertexInputAttributeDescription),
}; };
PipelineLayout simple_layout = { VkDescriptorSetLayoutBinding object_set_bindings[] = {
{
.binding = 0,
.descriptorCount = 1,
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.pImmutableSamplers = 0,
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
},
}; };
Map empty_map = { PipelineLayout simple_layout = {
.buckets = 0, .object_bindings = object_set_bindings,
.buckets_count = 0, .object_bindings_count = sizeof(object_set_bindings)/sizeof(*object_set_bindings),
}; };
return create_material(device, extent, render_pass, 2, shader_stages, scene_ubo_layout, simple_layout, simple_mesh_type, max_frames_in_flight, empty_map); Map object_descriptor_mappings = map_create(8, 2);
if(object_descriptor_mappings.buckets == 0) {
Material tmp = {};
return tmp;
}
Mapping* position_mapping = malloc(sizeof(Mapping));
if(position_mapping == 0) {
map_destroy(object_descriptor_mappings);
Material tmp = {};
return tmp;
}
position_mapping->mapping_type = MAPPING_POSITION_TO_MATRIX;
position_mapping->index = 0;
bool map_result = map_add(&object_descriptor_mappings, ATTRIBUTE_ID_POSITION, position_mapping);
if(map_result != true) {
map_destroy(object_descriptor_mappings);
free(position_mapping);
Material tmp = {};
return tmp;
}
return create_material(device, extent, render_pass, 2, shader_stages, scene_ubo_layout, simple_layout, simple_mesh_type, max_frames_in_flight, object_descriptor_mappings);
} }
Material create_texture_mesh_material(VkDevice device, VkExtent2D extent, VkRenderPass render_pass, VkDescriptorSetLayout scene_ubo_layout, uint32_t max_frames_in_flight) { Material create_texture_mesh_material(VkDevice device, VkExtent2D extent, VkRenderPass render_pass, VkDescriptorSetLayout scene_ubo_layout, uint32_t max_frames_in_flight) {
@ -2758,7 +2787,57 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
context->triangle_mesh = triangle_mesh; context->triangle_mesh = triangle_mesh;
} }
Object triangle_object = create_renderable(&context->triangle_mesh, &context->simple_mesh_material, 0, 2, 0); VkDescriptorPoolSize simple_pool_sizes[] = {
{
.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.descriptorCount = max_frames_in_flight,
},
};
VkDescriptorPoolCreateInfo simple_pool_info = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.poolSizeCount = 1,
.pPoolSizes = simple_pool_sizes,
.maxSets = max_frames_in_flight,
};
VkDescriptorPool simple_pool;
result = vkCreateDescriptorPool(context->device, &simple_pool_info, 0, &simple_pool);
if(result != VK_SUCCESS) {
fprintf(stderr, "failed to allocate simple_pool\n");
return 0;
}
VkDescriptorSetLayout* simple_set_layouts = malloc(sizeof(VkDescriptorSetLayout)*max_frames_in_flight);
if(simple_set_layouts == 0) {
fprintf(stderr, "failed to allocate simple_set_layouts\n");
return 0;
}
for(uint32_t i = 0; i < max_frames_in_flight; i++) {
simple_set_layouts[i] = simple_mesh_material.object_set_layout;
}
VkDescriptorSetAllocateInfo simple_alloc_info = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
.pSetLayouts = simple_set_layouts,
.descriptorSetCount = max_frames_in_flight,
.descriptorPool = simple_pool,
};
VkDescriptorSet* simple_descriptor_sets = malloc(sizeof(VkDescriptorSet)*max_frames_in_flight);
if(simple_descriptor_sets == 0) {
fprintf(stderr, "failed to allocate simple_descriptor_sets\n");
return 0;
}
result = vkAllocateDescriptorSets(context->device, &simple_alloc_info, simple_descriptor_sets);
if(result != VK_SUCCESS) {
fprintf(stderr, "failed to allocate descriptor sets from simple_pool\n");
return 0;
}
Object triangle_object = create_renderable(&context->triangle_mesh, &context->simple_mesh_material, 1, simple_descriptor_sets, max_frames_in_flight);
if(triangle_object.attributes.buckets == 0) { if(triangle_object.attributes.buckets == 0) {
fprintf(stderr, "failed to create renderable triangle object\n"); fprintf(stderr, "failed to create renderable triangle object\n");
return 0; return 0;
@ -2766,6 +2845,57 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
context->triangle_object = triangle_object; context->triangle_object = triangle_object;
} }
Position* simple_position = malloc(sizeof(Position));
if(simple_position == 0) {
fprintf(stderr, "failed to allocate simple_position\n");
return 0;
}
glm_quat_identity(simple_position->rotation);
glm_vec3_adds(simple_position->scale, 1.0f, simple_position->scale);
simple_position->position[0] = 0.0f;
simple_position->position[1] = 0.0f;
simple_position->position[2] = 2.0f;
bool map_result = map_add(&triangle_object.attributes, ATTRIBUTE_ID_POSITION, simple_position);
if(map_result == 0) {
return 0;
}
AllocatedBuffer* simple_position_buffers = allocate_buffers(context->physical_device, context->device, sizeof(struct ModelUBO), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, max_frames_in_flight);
if(simple_position_buffers == 0) {
fprintf(stderr, "failed to allocate simple_position_buffers\n");
return 0;
}
MaybeValue maybe_simple_descriptors = map_lookup(triangle_object.attributes, ATTRIBUTE_ID_DESCRIPTORS);
if(maybe_simple_descriptors.has_value == false) {
fprintf(stderr, "didn't find ATTRIBUTE_ID_DESCRIPTORS\n");
return 0;
}
void*** simple_descriptors = maybe_simple_descriptors.value;
for(uint32_t i = 0; i < max_frames_in_flight; i++) {
VkResult result = vkMapMemory(context->device, simple_position_buffers[i].memory, 0, sizeof(struct ModelUBO), 0, &simple_descriptors[i][0]);
if(result != VK_SUCCESS) {
return 0;
}
VkDescriptorBufferInfo buffer_info = {
.buffer = simple_position_buffers[i].buffer,
.offset = 0,
.range = sizeof(struct ModelUBO),
};
VkWriteDescriptorSet write_info = {
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = simple_descriptor_sets[i],
.dstBinding = 0,
.dstArrayElement = 0,
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.pBufferInfo = &buffer_info,
};
vkUpdateDescriptorSets(context->device, 1, &write_info, 0, 0);
}
Material texture_mesh_material = create_texture_mesh_material(context->device, context->swapchain_extent, context->render_pass, context->scene_descriptor_layout, max_frames_in_flight); Material texture_mesh_material = create_texture_mesh_material(context->device, context->swapchain_extent, context->render_pass, context->scene_descriptor_layout, max_frames_in_flight);
if(texture_mesh_material.pipeline == VK_NULL_HANDLE) { if(texture_mesh_material.pipeline == VK_NULL_HANDLE) {
fprintf(stderr, "failed to create texture mesh material\n"); fprintf(stderr, "failed to create texture mesh material\n");
@ -2836,7 +2966,7 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
return 0; return 0;
} }
Object triangle_object_textured = create_renderable(&context->triangle_mesh_textured, &context->texture_mesh_material, TODO_sets, max_frames_in_flight, 1); Object triangle_object_textured = create_renderable(&context->triangle_mesh_textured, &context->texture_mesh_material, 1, TODO_sets, max_frames_in_flight);
if(triangle_object_textured.attributes.buckets == 0) { if(triangle_object_textured.attributes.buckets == 0) {
fprintf(stderr, "failed to create renderable textured triangle object\n"); fprintf(stderr, "failed to create renderable textured triangle object\n");
return 0; return 0;
@ -2855,7 +2985,7 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
position->position[0] = 0.0f; position->position[0] = 0.0f;
position->position[1] = 0.0f; position->position[1] = 0.0f;
position->position[2] = 1.0f; position->position[2] = 1.0f;
bool map_result = map_add(&triangle_object_textured.attributes, ATTRIBUTE_ID_POSITION, position); map_result = map_add(&triangle_object_textured.attributes, ATTRIBUTE_ID_POSITION, position);
if(map_result == 0) { if(map_result == 0) {
return 0; return 0;
} }
@ -2873,7 +3003,7 @@ VulkanContext* init_vulkan(GLFWwindow* window, uint32_t max_frames_in_flight) {
void*** descriptors = maybe_descriptors.value; void*** descriptors = maybe_descriptors.value;
for(uint32_t i = 0; i < max_frames_in_flight; i++) { for(uint32_t i = 0; i < max_frames_in_flight; i++) {
VkResult result = vkMapMemory(device, triangle_ubos[i].memory, 0, sizeof(Position), 0, &descriptors[i][0]); VkResult result = vkMapMemory(device, triangle_ubos[i].memory, 0, sizeof(struct ModelUBO), 0, &descriptors[i][0]);
if(result != VK_SUCCESS) { if(result != VK_SUCCESS) {
return 0; return 0;
} }
@ -3199,9 +3329,10 @@ VkResult draw_frame(VulkanContext* context) {
return result; return result;
} }
uint32_t mesh_counts[] = {1}; uint32_t mesh_counts[] = {1, 1};
Object* objects[] = {&context->triangle_object_textured}; Object* objects[] = {&context->triangle_object_textured, &context->triangle_object};
result = command_draw_scene(1, &context->texture_mesh_material, (uint32_t*)&mesh_counts, (Object**)objects, context->current_frame, context->scene_descriptors, context->swapchain_command_buffers[context->current_frame], context->render_pass, context->swapchain_framebuffers[image_index], context->swapchain_extent); Material materials[] = {context->texture_mesh_material, context->simple_mesh_material};
result = command_draw_scene(2, materials, mesh_counts, objects, context->current_frame, context->scene_descriptors, context->swapchain_command_buffers[context->current_frame], context->render_pass, context->swapchain_framebuffers[image_index], context->swapchain_extent);
if(result != VK_SUCCESS) { if(result != VK_SUCCESS) {
return result; return result;
} }