Răsfoiți Sursa

gl_shader_cache: Fixes for async shaders

ameerj 5 ani în urmă
părinte
comite
dbee32d302

+ 23 - 2
src/video_core/renderer_opengl/gl_shader_cache.cpp

@@ -328,11 +328,32 @@ GraphicsPipeline* ShaderCache::CurrentGraphicsPipelineSlowPath() {
     if (is_new) {
         pipeline = CreateGraphicsPipeline();
     }
+    if (!pipeline) {
+        return nullptr;
+    }
     current_pipeline = pipeline.get();
-    if (!pipeline || !pipeline->IsBuilt()) {
+    return BuiltPipeline(current_pipeline);
+}
+
+GraphicsPipeline* ShaderCache::BuiltPipeline(GraphicsPipeline* pipeline) const noexcept {
+    if (pipeline->IsBuilt()) {
+        return pipeline;
+    }
+    if (!use_asynchronous_shaders) {
+        return pipeline;
+    }
+    // If something is using depth, we can assume that games are not rendering anything which
+    // will be used one time.
+    if (maxwell3d.regs.zeta_enable) {
         return nullptr;
     }
-    return pipeline.get();
+    // If games are using a small index count, we can assume these are full screen quads.
+    // Usually these shaders are only used once for building textures so we can assume they
+    // can't be built async
+    if (maxwell3d.regs.index_array.count <= 6 || maxwell3d.regs.vertex_buffer.count <= 6) {
+        return pipeline;
+    }
+    return nullptr;
 }
 
 ComputePipeline* ShaderCache::CurrentComputePipeline() {

+ 2 - 0
src/video_core/renderer_opengl/gl_shader_cache.h

@@ -54,6 +54,8 @@ public:
 private:
     GraphicsPipeline* CurrentGraphicsPipelineSlowPath();
 
+    [[nodiscard]] GraphicsPipeline* BuiltPipeline(GraphicsPipeline* pipeline) const noexcept;
+
     std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline();
 
     std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline(