|
|
@@ -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() {
|