diff options
Diffstat (limited to 'render/vulkan/renderer.c')
-rw-r--r-- | render/vulkan/renderer.c | 700 |
1 files changed, 384 insertions, 316 deletions
diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 3a0cfde4..e72b9200 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -83,10 +83,11 @@ static void mat3_to_mat4(const float mat3[9], float mat4[4][4]) { struct wlr_vk_descriptor_pool *vulkan_alloc_texture_ds( struct wlr_vk_renderer *renderer, VkDescriptorSet *ds) { VkResult res; - VkDescriptorSetAllocateInfo ds_info = {0}; - ds_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - ds_info.descriptorSetCount = 1; - ds_info.pSetLayouts = &renderer->ds_layout; + VkDescriptorSetAllocateInfo ds_info = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + .descriptorSetCount = 1, + .pSetLayouts = &renderer->ds_layout, + }; bool found = false; struct wlr_vk_descriptor_pool *pool; @@ -110,16 +111,18 @@ struct wlr_vk_descriptor_pool *vulkan_alloc_texture_ds( } pool->free = count; - VkDescriptorPoolSize pool_size = {0}; - pool_size.descriptorCount = count; - pool_size.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + VkDescriptorPoolSize pool_size = { + .descriptorCount = count, + .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + }; - VkDescriptorPoolCreateInfo dpool_info = {0}; - dpool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - dpool_info.maxSets = count; - dpool_info.poolSizeCount = 1; - dpool_info.pPoolSizes = &pool_size; - dpool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + VkDescriptorPoolCreateInfo dpool_info = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + .maxSets = count, + .poolSizeCount = 1, + .pPoolSizes = &pool_size, + .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, + }; res = vkCreateDescriptorPool(renderer->dev->dev, &dpool_info, NULL, &pool->pool); @@ -256,12 +259,13 @@ struct wlr_vk_buffer_span vulkan_get_stage_span(struct wlr_vk_renderer *r, } VkResult res; - VkBufferCreateInfo buf_info = {0}; - buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - buf_info.size = bsize; - buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | - VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + VkBufferCreateInfo buf_info = { + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .size = bsize, + .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | + VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + }; res = vkCreateBuffer(r->dev->dev, &buf_info, NULL, &buf->buffer); if (res != VK_SUCCESS) { wlr_vk_error("vkCreateBuffer", res); @@ -279,10 +283,11 @@ struct wlr_vk_buffer_span vulkan_get_stage_span(struct wlr_vk_renderer *r, goto error; } - VkMemoryAllocateInfo mem_info = {0}; - mem_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - mem_info.allocationSize = mem_reqs.size; - mem_info.memoryTypeIndex = (uint32_t)mem_type_index; + VkMemoryAllocateInfo mem_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = mem_reqs.size, + .memoryTypeIndex = (uint32_t)mem_type_index, + }; res = vkAllocateMemory(r->dev->dev, &mem_info, NULL, &buf->memory); if (res != VK_SUCCESS) { wlr_vk_error("vkAllocatorMemory", res); @@ -327,8 +332,9 @@ error_alloc: VkCommandBuffer vulkan_record_stage_cb(struct wlr_vk_renderer *renderer) { if (!renderer->stage.recording) { - VkCommandBufferBeginInfo begin_info = {0}; - begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + VkCommandBufferBeginInfo begin_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + }; vkBeginCommandBuffer(renderer->stage.cb, &begin_info); renderer->stage.recording = true; } @@ -344,10 +350,11 @@ bool vulkan_submit_stage_wait(struct wlr_vk_renderer *renderer) { vkEndCommandBuffer(renderer->stage.cb); renderer->stage.recording = false; - VkSubmitInfo submit_info = {0}; - submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submit_info.commandBufferCount = 1u; - submit_info.pCommandBuffers = &renderer->stage.cb; + VkSubmitInfo submit_info = { + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .commandBufferCount = 1u, + .pCommandBuffers = &renderer->stage.cb, + }; VkResult res = vkQueueSubmit(renderer->dev->queue, 1, &submit_info, renderer->fence); if (res != VK_SUCCESS) { @@ -448,17 +455,22 @@ static struct wlr_vk_render_buffer *create_render_buffer( goto error_buffer; } - VkImageViewCreateInfo view_info = {0}; - view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - view_info.image = buffer->image; - view_info.viewType = VK_IMAGE_VIEW_TYPE_2D; - view_info.format = fmt->format.vk_format; - view_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.subresourceRange = (VkImageSubresourceRange) { - VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 + VkImageViewCreateInfo view_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = buffer->image, + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = fmt->format.vk_format, + .components.r = VK_COMPONENT_SWIZZLE_IDENTITY, + .components.g = VK_COMPONENT_SWIZZLE_IDENTITY, + .components.b = VK_COMPONENT_SWIZZLE_IDENTITY, + .components.a = VK_COMPONENT_SWIZZLE_IDENTITY, + .subresourceRange = (VkImageSubresourceRange) { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }, }; res = vkCreateImageView(dev, &view_info, NULL, &buffer->image_view); @@ -473,15 +485,16 @@ static struct wlr_vk_render_buffer *create_render_buffer( goto error_view; } - VkFramebufferCreateInfo fb_info = {0}; - fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - fb_info.attachmentCount = 1u; - fb_info.pAttachments = &buffer->image_view; - fb_info.flags = 0u; - fb_info.width = dmabuf.width; - fb_info.height = dmabuf.height; - fb_info.layers = 1u; - fb_info.renderPass = buffer->render_setup->render_pass; + VkFramebufferCreateInfo fb_info = { + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .attachmentCount = 1u, + .pAttachments = &buffer->image_view, + .flags = 0u, + .width = dmabuf.width, + .height = dmabuf.height, + .layers = 1u, + .renderPass = buffer->render_setup->render_pass, + }; res = vkCreateFramebuffer(dev, &fb_info, NULL, &buffer->framebuffer); if (res != VK_SUCCESS) { @@ -553,8 +566,9 @@ static void vulkan_begin(struct wlr_renderer *wlr_renderer, assert(renderer->current_render_buffer); VkCommandBuffer cb = renderer->cb; - VkCommandBufferBeginInfo begin_info = {0}; - begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + VkCommandBufferBeginInfo begin_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + }; vkBeginCommandBuffer(cb, &begin_info); // begin render pass @@ -563,12 +577,13 @@ static void vulkan_begin(struct wlr_renderer *wlr_renderer, VkRect2D rect = {{0, 0}, {width, height}}; renderer->scissor = rect; - VkRenderPassBeginInfo rp_info = {0}; - rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - rp_info.renderArea = rect; - rp_info.renderPass = renderer->current_render_buffer->render_setup->render_pass; - rp_info.framebuffer = fb; - rp_info.clearValueCount = 0; + VkRenderPassBeginInfo rp_info = { + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, + .renderArea = rect, + .renderPass = renderer->current_render_buffer->render_setup->render_pass, + .framebuffer = fb, + .clearValueCount = 0, + }; vkCmdBeginRenderPass(cb, &rp_info, VK_SUBPASS_CONTENTS_INLINE); VkViewport vp = {0.f, 0.f, (float) width, (float) height, 0.f, 1.f}; @@ -808,24 +823,27 @@ static void vulkan_clear(struct wlr_renderer *wlr_renderer, struct wlr_vk_renderer *renderer = vulkan_get_renderer(wlr_renderer); VkCommandBuffer cb = renderer->cb; - VkClearAttachment att = {0}; - att.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - att.colorAttachment = 0u; + VkClearAttachment att = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .colorAttachment = 0u, + // Input color values are given in srgb space, vulkan expects + // them in linear space. We explicitly import argb8 render buffers + // as srgb, vulkan will convert the input values we give here to + // srgb first. + // But in other parts of wlroots we just always assume + // srgb so that's why we have to convert here. + .clearValue.color.float32 = { + color_to_linear(color[0]), + color_to_linear(color[1]), + color_to_linear(color[2]), + color[3], // no conversion for alpha + }, + }; - // Input color values are given in srgb space, vulkan expects - // them in linear space. We explicitly import argb8 render buffers - // as srgb, vulkan will convert the input values we give here to - // srgb first. - // But in other parts of wlroots we just always assume - // srgb so that's why we have to convert here. - att.clearValue.color.float32[0] = color_to_linear(color[0]); - att.clearValue.color.float32[1] = color_to_linear(color[1]); - att.clearValue.color.float32[2] = color_to_linear(color[2]); - att.clearValue.color.float32[3] = color[3]; // no conversion for alpha - - VkClearRect rect = {0}; - rect.rect = renderer->scissor; - rect.layerCount = 1; + VkClearRect rect = { + .rect = renderer->scissor, + .layerCount = 1, + }; vkCmdClearAttachments(cb, 1, &att, 1, &rect); } @@ -1242,15 +1260,19 @@ static bool init_tex_layouts(struct wlr_vk_renderer *renderer, // layouts // descriptor set - VkDescriptorSetLayoutBinding ds_bindings[1] = {{ - 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, - VK_SHADER_STAGE_FRAGMENT_BIT, &tex_sampler, - }}; + VkDescriptorSetLayoutBinding ds_binding = { + .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, + .pImmutableSamplers = &tex_sampler, + }; - VkDescriptorSetLayoutCreateInfo ds_info = {0}; - ds_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - ds_info.bindingCount = 1; - ds_info.pBindings = ds_bindings; + VkDescriptorSetLayoutCreateInfo ds_info = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .bindingCount = 1, + .pBindings = &ds_binding, + }; res = vkCreateDescriptorSetLayout(dev, &ds_info, NULL, out_ds_layout); if (res != VK_SUCCESS) { @@ -1259,20 +1281,25 @@ static bool init_tex_layouts(struct wlr_vk_renderer *renderer, } // pipeline layout - VkPushConstantRange pc_ranges[2] = {0}; - pc_ranges[0].size = sizeof(struct vert_pcr_data); - pc_ranges[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - - pc_ranges[1].offset = pc_ranges[0].size; - pc_ranges[1].size = sizeof(float) * 4; // alpha or color - pc_ranges[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + VkPushConstantRange pc_ranges[2] = { + { + .size = sizeof(struct vert_pcr_data), + .stageFlags = VK_SHADER_STAGE_VERTEX_BIT, + }, + { + .offset = pc_ranges[0].size, + .size = sizeof(float) * 4, // alpha or color + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, + }, + }; - VkPipelineLayoutCreateInfo pl_info = {0}; - pl_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - pl_info.setLayoutCount = 1; - pl_info.pSetLayouts = out_ds_layout; - pl_info.pushConstantRangeCount = 2; - pl_info.pPushConstantRanges = pc_ranges; + VkPipelineLayoutCreateInfo pl_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .setLayoutCount = 1, + .pSetLayouts = out_ds_layout, + .pushConstantRangeCount = 2, + .pPushConstantRanges = pc_ranges, + }; res = vkCreatePipelineLayout(dev, &pl_info, NULL, out_pipe_layout); if (res != VK_SUCCESS) { @@ -1304,73 +1331,82 @@ static bool init_tex_pipeline(struct wlr_vk_renderer *renderer, }}; // info - VkPipelineInputAssemblyStateCreateInfo assembly = {0}; - assembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; - assembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; - - VkPipelineRasterizationStateCreateInfo rasterization = {0}; - rasterization.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; - rasterization.polygonMode = VK_POLYGON_MODE_FILL; - rasterization.cullMode = VK_CULL_MODE_NONE; - rasterization.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - rasterization.lineWidth = 1.f; - - VkPipelineColorBlendAttachmentState blend_attachment = {0}; - blend_attachment.blendEnable = true; - // we generally work with pre-multiplied alpha - blend_attachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; - blend_attachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - blend_attachment.colorBlendOp = VK_BLEND_OP_ADD; - blend_attachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - blend_attachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - blend_attachment.alphaBlendOp = VK_BLEND_OP_ADD; - blend_attachment.colorWriteMask = - VK_COLOR_COMPONENT_R_BIT | - VK_COLOR_COMPONENT_G_BIT | - VK_COLOR_COMPONENT_B_BIT | - VK_COLOR_COMPONENT_A_BIT; - - VkPipelineColorBlendStateCreateInfo blend = {0}; - blend.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - blend.attachmentCount = 1; - blend.pAttachments = &blend_attachment; - - VkPipelineMultisampleStateCreateInfo multisample = {0}; - multisample.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - multisample.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; - - VkPipelineViewportStateCreateInfo viewport = {0}; - viewport.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; - viewport.viewportCount = 1; - viewport.scissorCount = 1; + VkPipelineInputAssemblyStateCreateInfo assembly = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, + }; + + VkPipelineRasterizationStateCreateInfo rasterization = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + .polygonMode = VK_POLYGON_MODE_FILL, + .cullMode = VK_CULL_MODE_NONE, + .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE, + .lineWidth = 1.f, + }; + + VkPipelineColorBlendAttachmentState blend_attachment = { + .blendEnable = true, + // we generally work with pre-multiplied alpha + .srcColorBlendFactor = VK_BLEND_FACTOR_ONE, + .dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + .colorBlendOp = VK_BLEND_OP_ADD, + .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, + .dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE, + .alphaBlendOp = VK_BLEND_OP_ADD, + .colorWriteMask = + VK_COLOR_COMPONENT_R_BIT | + VK_COLOR_COMPONENT_G_BIT | + VK_COLOR_COMPONENT_B_BIT | + VK_COLOR_COMPONENT_A_BIT, + }; + + VkPipelineColorBlendStateCreateInfo blend = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, + .attachmentCount = 1, + .pAttachments = &blend_attachment, + }; + + VkPipelineMultisampleStateCreateInfo multisample = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, + .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, + }; + + VkPipelineViewportStateCreateInfo viewport = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, + .viewportCount = 1, + .scissorCount = 1, + }; VkDynamicState dynStates[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, }; - VkPipelineDynamicStateCreateInfo dynamic = {0}; - dynamic.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - dynamic.pDynamicStates = dynStates; - dynamic.dynamicStateCount = 2; - - VkPipelineVertexInputStateCreateInfo vertex = {0}; - vertex.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - - VkGraphicsPipelineCreateInfo pinfo = {0}; - pinfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - pinfo.layout = pipe_layout; - pinfo.renderPass = rp; - pinfo.subpass = 0; - pinfo.stageCount = 2; - pinfo.pStages = tex_stages; - - pinfo.pInputAssemblyState = &assembly; - pinfo.pRasterizationState = &rasterization; - pinfo.pColorBlendState = &blend; - pinfo.pMultisampleState = &multisample; - pinfo.pViewportState = &viewport; - pinfo.pDynamicState = &dynamic; - pinfo.pVertexInputState = &vertex; + VkPipelineDynamicStateCreateInfo dynamic = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .pDynamicStates = dynStates, + .dynamicStateCount = 2, + }; + + VkPipelineVertexInputStateCreateInfo vertex = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + }; + + VkGraphicsPipelineCreateInfo pinfo = { + .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, + .layout = pipe_layout, + .renderPass = rp, + .subpass = 0, + .stageCount = 2, + .pStages = tex_stages, + + .pInputAssemblyState = &assembly, + .pRasterizationState = &rasterization, + .pColorBlendState = &blend, + .pMultisampleState = &multisample, + .pViewportState = &viewport, + .pDynamicState = &dynamic, + .pVertexInputState = &vertex, + }; // NOTE: use could use a cache here for faster loading // store it somewhere like $XDG_CACHE_HOME/wlroots/vk_pipe_cache @@ -1392,18 +1428,19 @@ static bool init_static_render_data(struct wlr_vk_renderer *renderer) { VkDevice dev = renderer->dev->dev; // default sampler (non ycbcr) - VkSamplerCreateInfo sampler_info = {0}; - sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - sampler_info.magFilter = VK_FILTER_LINEAR; - sampler_info.minFilter = VK_FILTER_LINEAR; - sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; - sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; - sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; - sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; - sampler_info.maxAnisotropy = 1.f; - sampler_info.minLod = 0.f; - sampler_info.maxLod = 0.25f; - sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; + VkSamplerCreateInfo sampler_info = { + .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, + .magFilter = VK_FILTER_LINEAR, + .minFilter = VK_FILTER_LINEAR, + .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, + .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT, + .addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT, + .addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT, + .maxAnisotropy = 1.f, + .minLod = 0.f, + .maxLod = 0.25f, + .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, + }; res = vkCreateSampler(dev, &sampler_info, NULL, &renderer->sampler); if (res != VK_SUCCESS) { @@ -1418,10 +1455,11 @@ static bool init_static_render_data(struct wlr_vk_renderer *renderer) { // load vert module and tex frag module since they are needed to // initialize the tex pipeline - VkShaderModuleCreateInfo sinfo = {0}; - sinfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - sinfo.codeSize = sizeof(common_vert_data); - sinfo.pCode = common_vert_data; + VkShaderModuleCreateInfo sinfo = { + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = sizeof(common_vert_data), + .pCode = common_vert_data, + }; res = vkCreateShaderModule(dev, &sinfo, NULL, &renderer->vert_module); if (res != VK_SUCCESS) { wlr_vk_error("Failed to create vertex shader module", res); @@ -1429,8 +1467,11 @@ static bool init_static_render_data(struct wlr_vk_renderer *renderer) { } // tex frag - sinfo.codeSize = sizeof(texture_frag_data); - sinfo.pCode = texture_frag_data; + sinfo = (VkShaderModuleCreateInfo){ + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = sizeof(texture_frag_data), + .pCode = texture_frag_data, + }; res = vkCreateShaderModule(dev, &sinfo, NULL, &renderer->tex_frag_module); if (res != VK_SUCCESS) { wlr_vk_error("Failed to create tex fragment shader module", res); @@ -1438,8 +1479,11 @@ static bool init_static_render_data(struct wlr_vk_renderer *renderer) { } // quad frag - sinfo.codeSize = sizeof(quad_frag_data); - sinfo.pCode = quad_frag_data; + sinfo = (VkShaderModuleCreateInfo){ + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = sizeof(quad_frag_data), + .pCode = quad_frag_data, + }; res = vkCreateShaderModule(dev, &sinfo, NULL, &renderer->quad_frag_module); if (res != VK_SUCCESS) { wlr_vk_error("Failed to create quad fragment shader module", res); @@ -1470,58 +1514,66 @@ static struct wlr_vk_render_format_setup *find_or_create_render_setup( VkDevice dev = renderer->dev->dev; VkResult res; - VkAttachmentDescription attachment = {0}; - attachment.format = format; - attachment.samples = VK_SAMPLE_COUNT_1_BIT; - attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachment.initialLayout = VK_IMAGE_LAYOUT_GENERAL; - attachment.finalLayout = VK_IMAGE_LAYOUT_GENERAL; - - VkAttachmentReference color_ref = {0}; - color_ref.attachment = 0u; - color_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkSubpassDescription subpass = {0}; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &color_ref; - - VkSubpassDependency deps[2] = {0}; - deps[0].srcSubpass = VK_SUBPASS_EXTERNAL; - deps[0].srcStageMask = VK_PIPELINE_STAGE_HOST_BIT | - VK_PIPELINE_STAGE_TRANSFER_BIT | - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - deps[0].srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | - VK_ACCESS_TRANSFER_WRITE_BIT | - VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - deps[0].dstSubpass = 0; - deps[0].dstStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; - deps[0].dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT | - VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | - VK_ACCESS_INDIRECT_COMMAND_READ_BIT | - VK_ACCESS_SHADER_READ_BIT; - - deps[1].srcSubpass = 0; - deps[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - deps[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - deps[1].dstSubpass = VK_SUBPASS_EXTERNAL; - deps[1].dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT | - VK_PIPELINE_STAGE_HOST_BIT | VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - deps[1].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | - VK_ACCESS_MEMORY_READ_BIT; - - VkRenderPassCreateInfo rp_info = {0}; - rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - rp_info.attachmentCount = 1; - rp_info.pAttachments = &attachment; - rp_info.subpassCount = 1; - rp_info.pSubpasses = &subpass; - rp_info.dependencyCount = 2u; - rp_info.pDependencies = deps; + VkAttachmentDescription attachment = { + .format = format, + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = VK_IMAGE_LAYOUT_GENERAL, + .finalLayout = VK_IMAGE_LAYOUT_GENERAL, + }; + + VkAttachmentReference color_ref = { + .attachment = 0u, + .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + }; + + VkSubpassDescription subpass = { + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .colorAttachmentCount = 1, + .pColorAttachments = &color_ref, + }; + + VkSubpassDependency deps[2] = { + { + .srcSubpass = VK_SUBPASS_EXTERNAL, + .srcStageMask = VK_PIPELINE_STAGE_HOST_BIT | + VK_PIPELINE_STAGE_TRANSFER_BIT | + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | + VK_ACCESS_TRANSFER_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dstSubpass = 0, + .dstStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, + .dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT | + VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | + VK_ACCESS_INDIRECT_COMMAND_READ_BIT | + VK_ACCESS_SHADER_READ_BIT, + }, + { + .srcSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dstSubpass = VK_SUBPASS_EXTERNAL, + .dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT | + VK_PIPELINE_STAGE_HOST_BIT | VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, + .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | + VK_ACCESS_MEMORY_READ_BIT, + }, + }; + + VkRenderPassCreateInfo rp_info = { + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, + .attachmentCount = 1, + .pAttachments = &attachment, + .subpassCount = 1, + .pSubpasses = &subpass, + .dependencyCount = 2u, + .pDependencies = deps, + }; res = vkCreateRenderPass(dev, &rp_info, NULL, &setup->render_pass); if (res != VK_SUCCESS) { @@ -1535,85 +1587,97 @@ static struct wlr_vk_render_format_setup *find_or_create_render_setup( goto error; } - VkPipelineShaderStageCreateInfo vert_stage = { - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - NULL, 0, VK_SHADER_STAGE_VERTEX_BIT, renderer->vert_module, - "main", NULL + VkPipelineShaderStageCreateInfo quad_stages[2] = { + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_VERTEX_BIT, + .module = renderer->vert_module, + .pName = "main", + }, + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_FRAGMENT_BIT, + .module = renderer->quad_frag_module, + .pName = "main", + }, }; - VkPipelineShaderStageCreateInfo quad_stages[2] = {vert_stage, { - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - NULL, 0, VK_SHADER_STAGE_FRAGMENT_BIT, - renderer->quad_frag_module, "main", NULL - }}; - // info - VkPipelineInputAssemblyStateCreateInfo assembly = {0}; - assembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; - assembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; - - VkPipelineRasterizationStateCreateInfo rasterization = {0}; - rasterization.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; - rasterization.polygonMode = VK_POLYGON_MODE_FILL; - rasterization.cullMode = VK_CULL_MODE_NONE; - rasterization.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - rasterization.lineWidth = 1.f; - - VkPipelineColorBlendAttachmentState blend_attachment = {0}; - blend_attachment.blendEnable = true; - blend_attachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; - blend_attachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - blend_attachment.colorBlendOp = VK_BLEND_OP_ADD; - blend_attachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - blend_attachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - blend_attachment.alphaBlendOp = VK_BLEND_OP_ADD; - blend_attachment.colorWriteMask = - VK_COLOR_COMPONENT_R_BIT | - VK_COLOR_COMPONENT_G_BIT | - VK_COLOR_COMPONENT_B_BIT | - VK_COLOR_COMPONENT_A_BIT; - - VkPipelineColorBlendStateCreateInfo blend = {0}; - blend.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - blend.attachmentCount = 1; - blend.pAttachments = &blend_attachment; - - VkPipelineMultisampleStateCreateInfo multisample = {0}; - multisample.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - multisample.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; - - VkPipelineViewportStateCreateInfo viewport = {0}; - viewport.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; - viewport.viewportCount = 1; - viewport.scissorCount = 1; + VkPipelineInputAssemblyStateCreateInfo assembly = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, + }; + + VkPipelineRasterizationStateCreateInfo rasterization = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + .polygonMode = VK_POLYGON_MODE_FILL, + .cullMode = VK_CULL_MODE_NONE, + .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE, + .lineWidth = 1.f, + }; + + VkPipelineColorBlendAttachmentState blend_attachment = { + .blendEnable = true, + .srcColorBlendFactor = VK_BLEND_FACTOR_ONE, + .dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + .colorBlendOp = VK_BLEND_OP_ADD, + .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, + .dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE, + .alphaBlendOp = VK_BLEND_OP_ADD, + .colorWriteMask = + VK_COLOR_COMPONENT_R_BIT | + VK_COLOR_COMPONENT_G_BIT | + VK_COLOR_COMPONENT_B_BIT | + VK_COLOR_COMPONENT_A_BIT, + }; + + VkPipelineColorBlendStateCreateInfo blend = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, + .attachmentCount = 1, + .pAttachments = &blend_attachment, + }; + + VkPipelineMultisampleStateCreateInfo multisample = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, + .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, + }; + + VkPipelineViewportStateCreateInfo viewport = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, + .viewportCount = 1, + .scissorCount = 1, + }; VkDynamicState dynStates[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, }; - VkPipelineDynamicStateCreateInfo dynamic = {0}; - dynamic.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - dynamic.pDynamicStates = dynStates; - dynamic.dynamicStateCount = 2; - - VkPipelineVertexInputStateCreateInfo vertex = {0}; - vertex.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - - VkGraphicsPipelineCreateInfo pinfo = {0}; - pinfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - pinfo.layout = renderer->pipe_layout; - pinfo.renderPass = setup->render_pass; - pinfo.subpass = 0; - pinfo.stageCount = 2; - pinfo.pStages = quad_stages; - - pinfo.pInputAssemblyState = &assembly; - pinfo.pRasterizationState = &rasterization; - pinfo.pColorBlendState = &blend; - pinfo.pMultisampleState = &multisample; - pinfo.pViewportState = &viewport; - pinfo.pDynamicState = &dynamic; - pinfo.pVertexInputState = &vertex; + VkPipelineDynamicStateCreateInfo dynamic = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .pDynamicStates = dynStates, + .dynamicStateCount = 2, + }; + + VkPipelineVertexInputStateCreateInfo vertex = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + }; + + VkGraphicsPipelineCreateInfo pinfo = { + .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, + .layout = renderer->pipe_layout, + .renderPass = setup->render_pass, + .subpass = 0, + .stageCount = 2, + .pStages = quad_stages, + + .pInputAssemblyState = &assembly, + .pRasterizationState = &rasterization, + .pColorBlendState = &blend, + .pMultisampleState = &multisample, + .pViewportState = &viewport, + .pDynamicState = &dynamic, + .pVertexInputState = &vertex, + }; // NOTE: use could use a cache here for faster loading // store it somewhere like $XDG_CACHE_HOME/wlroots/vk_pipe_cache.bin @@ -1655,10 +1719,11 @@ struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev } // command pool - VkCommandPoolCreateInfo cpool_info = {0}; - cpool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - cpool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - cpool_info.queueFamilyIndex = dev->queue_family; + VkCommandPoolCreateInfo cpool_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, + .queueFamilyIndex = dev->queue_family, + }; res = vkCreateCommandPool(dev->dev, &cpool_info, NULL, &renderer->command_pool); if (res != VK_SUCCESS) { @@ -1666,19 +1731,21 @@ struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev goto error; } - VkCommandBufferAllocateInfo cbai = {0}; - cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - cbai.commandBufferCount = 1u; - cbai.commandPool = renderer->command_pool; - cbai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + VkCommandBufferAllocateInfo cbai = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandBufferCount = 1u, + .commandPool = renderer->command_pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + }; res = vkAllocateCommandBuffers(dev->dev, &cbai, &renderer->cb); if (res != VK_SUCCESS) { wlr_vk_error("vkAllocateCommandBuffers", res); goto error; } - VkFenceCreateInfo fence_info = {0}; - fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + VkFenceCreateInfo fence_info = { + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + }; res = vkCreateFence(dev->dev, &fence_info, NULL, &renderer->fence); if (res != VK_SUCCESS) { @@ -1687,11 +1754,12 @@ struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev } // staging command buffer - VkCommandBufferAllocateInfo cmd_buf_info = {0}; - cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - cmd_buf_info.commandPool = renderer->command_pool; - cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - cmd_buf_info.commandBufferCount = 1u; + VkCommandBufferAllocateInfo cmd_buf_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = renderer->command_pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1u, + }; res = vkAllocateCommandBuffers(dev->dev, &cmd_buf_info, &renderer->stage.cb); if (res != VK_SUCCESS) { |