Просмотр исходного кода

shader: Fix rasterizer integration order issues

ReinUsesLisp 5 лет назад
Родитель
Сommit
ec005be99d

+ 5 - 2
src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp

@@ -139,7 +139,6 @@ void GraphicsPipeline::Configure(bool is_indexed) {
     static_vector<VkSampler, max_images_elements> samplers;
 
     texture_cache->SynchronizeGraphicsDescriptors();
-    texture_cache->UpdateRenderTargets(false);
 
     const auto& regs{maxwell3d->regs};
     const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex};
@@ -181,13 +180,17 @@ void GraphicsPipeline::Configure(bool is_indexed) {
         PushImageDescriptors(stage_infos[stage], samplers.data(), image_view_ids.data(),
                              *texture_cache, *update_descriptor_queue, index);
     }
+    texture_cache->UpdateRenderTargets(false);
+    scheduler->RequestRenderpass(texture_cache->GetFramebuffer());
+
+    scheduler->BindGraphicsPipeline(*pipeline);
+
     if (!descriptor_set_layout) {
         return;
     }
     const VkDescriptorSet descriptor_set{descriptor_allocator.Commit()};
     update_descriptor_queue->Send(*descriptor_update_template, descriptor_set);
 
-    scheduler->BindGraphicsPipeline(*pipeline);
     scheduler->Record([descriptor_set, layout = *pipeline_layout](vk::CommandBuffer cmdbuf) {
         cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set,
                                   nullptr);

+ 0 - 1
src/video_core/renderer_vulkan/vk_rasterizer.cpp

@@ -178,7 +178,6 @@ void RasterizerVulkan::Draw(bool is_indexed, bool is_instanced) {
 
     BeginTransformFeedback();
 
-    scheduler.RequestRenderpass(texture_cache.GetFramebuffer());
     UpdateDynamicStates();
 
     const auto& regs{maxwell3d.regs};

+ 1 - 4
src/video_core/renderer_vulkan/vk_render_pass_cache.cpp

@@ -56,15 +56,12 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) {
         return *pair->second;
     }
     boost::container::static_vector<VkAttachmentDescription, 9> descriptions;
-    u32 num_images{0};
-
     for (size_t index = 0; index < key.color_formats.size(); ++index) {
         const PixelFormat format{key.color_formats[index]};
         if (format == PixelFormat::Invalid) {
             continue;
         }
         descriptions.push_back(AttachmentDescription(*device, format, key.samples));
-        ++num_images;
     }
     const size_t num_colors{descriptions.size()};
     const VkAttachmentReference* depth_attachment{};
@@ -89,7 +86,7 @@ VkRenderPass RenderPassCache::Get(const RenderPassKey& key) {
         .pNext = nullptr,
         .flags = 0,
         .attachmentCount = static_cast<u32>(descriptions.size()),
-        .pAttachments = descriptions.data(),
+        .pAttachments = descriptions.empty() ? nullptr : descriptions.data(),
         .subpassCount = 1,
         .pSubpasses = &subpass,
         .dependencyCount = 0,