aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--render/vulkan/renderer.c75
1 files changed, 28 insertions, 47 deletions
diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c
index 57334af7..8917f540 100644
--- a/render/vulkan/renderer.c
+++ b/render/vulkan/renderer.c
@@ -1953,38 +1953,6 @@ static const struct wlr_renderer_impl renderer_impl = {
.begin_buffer_pass = vulkan_begin_buffer_pass,
};
-static bool init_sampler(struct wlr_vk_renderer *renderer, VkSampler *sampler,
- VkSamplerYcbcrConversion ycbcr_conversion) {
- VkSamplerCreateInfo sampler_create_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_CLAMP_TO_EDGE,
- .addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
- .addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
- .minLod = 0.f,
- .maxLod = 0.25f,
- };
-
- VkSamplerYcbcrConversionInfo conversion_info;
- if (ycbcr_conversion != VK_NULL_HANDLE) {
- conversion_info = (VkSamplerYcbcrConversionInfo){
- .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
- .conversion = ycbcr_conversion,
- };
- sampler_create_info.pNext = &conversion_info;
- }
-
- VkResult res = vkCreateSampler(renderer->dev->dev, &sampler_create_info, NULL, sampler);
- if (res != VK_SUCCESS) {
- wlr_vk_error("vkCreateSampler", res);
- return false;
- }
-
- return true;
-}
-
// Initializes the VkDescriptorSetLayout and VkPipelineLayout needed
// for the texture rendering pipeline using the given VkSampler.
static bool init_tex_layouts(struct wlr_vk_renderer *renderer,
@@ -2392,19 +2360,6 @@ static bool init_blend_to_output_pipeline(struct wlr_vk_renderer *renderer,
return true;
}
-static bool init_pipeline_layout(struct wlr_vk_renderer *renderer,
- struct wlr_vk_pipeline_layout *pipeline_layout) {
- if (!init_sampler(renderer, &pipeline_layout->sampler, pipeline_layout->ycbcr.conversion)) {
- return false;
- }
-
- if (!init_tex_layouts(renderer, pipeline_layout->sampler, &pipeline_layout->ds, &pipeline_layout->vk)) {
- return false;
- }
-
- return true;
-}
-
struct wlr_vk_pipeline_layout *get_or_create_pipeline_layout(
struct wlr_vk_renderer *renderer,
const struct wlr_vk_pipeline_layout_key *key) {
@@ -2424,6 +2379,19 @@ struct wlr_vk_pipeline_layout *get_or_create_pipeline_layout(
VkResult res;
+ VkSamplerYcbcrConversionInfo conversion_info;
+ VkSamplerCreateInfo sampler_create_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_CLAMP_TO_EDGE,
+ .addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
+ .addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
+ .minLod = 0.f,
+ .maxLod = 0.25f,
+ };
+
if (key->ycbcr_format) {
VkSamplerYcbcrConversionCreateInfo conversion_create_info = {
.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
@@ -2441,11 +2409,24 @@ struct wlr_vk_pipeline_layout *get_or_create_pipeline_layout(
free(pipeline_layout);
return NULL;
}
+
+ conversion_info = (VkSamplerYcbcrConversionInfo){
+ .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
+ .conversion = pipeline_layout->ycbcr.conversion,
+ };
+ sampler_create_info.pNext = &conversion_info;
+ }
+
+ res = vkCreateSampler(renderer->dev->dev, &sampler_create_info, NULL, &pipeline_layout->sampler);
+ if (res != VK_SUCCESS) {
+ wlr_vk_error("vkCreateSampler", res);
+ free(pipeline_layout);
+ return false;
}
- if (!init_pipeline_layout(renderer, pipeline_layout)) {
+ if (!init_tex_layouts(renderer, pipeline_layout->sampler, &pipeline_layout->ds, &pipeline_layout->vk)) {
free(pipeline_layout);
- return NULL;
+ return false;
}
wl_list_insert(&renderer->pipeline_layouts, &pipeline_layout->link);