gl_shader_cache: Fixes for async shaders
This commit is contained in:
parent
57171b23f9
commit
dbee32d302
@ -328,11 +328,32 @@ GraphicsPipeline* ShaderCache::CurrentGraphicsPipelineSlowPath() {
|
|||||||
if (is_new) {
|
if (is_new) {
|
||||||
pipeline = CreateGraphicsPipeline();
|
pipeline = CreateGraphicsPipeline();
|
||||||
}
|
}
|
||||||
current_pipeline = pipeline.get();
|
if (!pipeline) {
|
||||||
if (!pipeline || !pipeline->IsBuilt()) {
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return pipeline.get();
|
current_pipeline = pipeline.get();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
// 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() {
|
ComputePipeline* ShaderCache::CurrentComputePipeline() {
|
||||||
|
@ -54,6 +54,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
GraphicsPipeline* CurrentGraphicsPipelineSlowPath();
|
GraphicsPipeline* CurrentGraphicsPipelineSlowPath();
|
||||||
|
|
||||||
|
[[nodiscard]] GraphicsPipeline* BuiltPipeline(GraphicsPipeline* pipeline) const noexcept;
|
||||||
|
|
||||||
std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline();
|
std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline();
|
||||||
|
|
||||||
std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline(
|
std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline(
|
||||||
|
Loading…
Reference in New Issue
Block a user