|
Blender V5.0
|
#include <vk_pipeline_pool.hh>
Inherits blender::NonCopyable.
Public Member Functions | |
| VKPipelinePool () | |
| void | init () |
| VkPipeline | get_or_create_compute_pipeline (VKComputeInfo &compute_info, bool is_static_shader, VkPipeline vk_pipeline_base) |
| VkPipeline | get_or_create_graphics_pipeline (VKGraphicsInfo &graphics_info, bool is_static_shader, VkPipeline vk_pipeline_base) |
| void | discard (VKDiscardPool &discard_pool, VkPipelineLayout vk_pipeline_layout) |
| void | free_data () |
Persistent cache | |
| void | read_from_disk () |
| void | write_to_disk () |
| Public Member Functions inherited from blender::NonCopyable | |
| NonCopyable (const NonCopyable &other)=delete | |
| NonCopyable & | operator= (const NonCopyable &other)=delete |
| NonCopyable ()=default | |
| NonCopyable (NonCopyable &&other)=default | |
| NonCopyable & | operator= (NonCopyable &&other)=default |
Friends | |
| class | VKDevice |
Pipelines are lazy initialized and same pipelines should share their handle.
A requirement of our render graph implementation is that changes of the pipeline can be detected based on the VkPipeline handle. We only want to rebind the pipeline handle when the handle actually changes. This improves performance (especially on NVIDIA) devices where pipeline binds are known to be costly.
Especially for graphics pipelines many parameters are needed to compile a graphics pipeline. Some of the information would be boiler plating; or at least from Blender point of view. To improve lookup performance we use a slimmed down version of the pipeline create info structs. The idea is that we can limit the required data because we control which data we actually use, removing the boiler plating and improve hashing performance better than the VkPipelineCache can give us.
TODO: Extensions like VK_EXT_graphics_pipeline_library should fit in this class and ease the development for graphics pipelines. Geometry in and frame-buffer out could be cached separately to reduce pipeline creation times. Most likely we will add support when we work on graphic pipelines. Recent drivers all support this extension, but the full coverage is still <20%. A fallback should made available for older drivers is required.
TODO: Creation of shader modules needs to be revisited. VK_EXT_graphics_pipeline_library deprecates the use of shader modules and use the spriv bin directly. In this extension the pipeline and shader module are the same. The current approach should also be revisited as the latest drivers all implement pipeline libraries, but there are some platforms where the driver isn't been updated and doesn't implement this extension. In that case shader modules should still be used.
TODO: GPUMaterials (or any other large shader) should be unloaded when the gpu::Shader is destroyed. Exact details what the best approach is unclear as support for EEVEE is still lacking.
Definition at line 247 of file vk_pipeline_pool.hh.
| blender::gpu::VKPipelinePool::VKPipelinePool | ( | ) |
Definition at line 26 of file vk_pipeline_pool.cc.
References i.
| void blender::gpu::VKPipelinePool::discard | ( | VKDiscardPool & | discard_pool, |
| VkPipelineLayout | vk_pipeline_layout ) |
Discard all pipelines that uses the given pipeline_layout.
Definition at line 655 of file vk_pipeline_pool.cc.
References blender::gpu::VKDiscardPool::discard_pipeline(), and lock.
Referenced by blender::gpu::VKShader::~VKShader().
| void blender::gpu::VKPipelinePool::free_data | ( | ) |
Destroy all created pipelines.
Function is called just before the device is removed. This cannot be done in the destructor as that would be called after the device is removed.
Definition at line 674 of file vk_pipeline_pool.cc.
References blender::gpu::VKBackend::device, blender::gpu::VKBackend::get(), lock, blender::gpu::VKDevice::vk_handle(), and VKDevice.
| VkPipeline blender::gpu::VKPipelinePool::get_or_create_compute_pipeline | ( | VKComputeInfo & | compute_info, |
| bool | is_static_shader, | ||
| VkPipeline | vk_pipeline_base ) |
Get an existing or create a new compute pipeline based on the provided ComputeInfo.
When vk_pipeline_base is a valid pipeline handle, the pipeline base will be used to speed up pipeline creation process.
Definition at line 185 of file vk_pipeline_pool.cc.
References BLI_assert, blender::gpu::VKExtensions::descriptor_buffer, blender::gpu::VKBackend::device, blender::gpu::VKDevice::extensions_get(), blender::gpu::VKBackend::get(), lock, result, blender::gpu::VKComputeInfo::specialization_constants, blender::gpu::VKDevice::vk_handle(), blender::gpu::VKComputeInfo::vk_pipeline_layout, blender::gpu::VKComputeInfo::vk_shader_module, and VKDevice.
Referenced by blender::gpu::VKShader::ensure_and_get_compute_pipeline().
| VkPipeline blender::gpu::VKPipelinePool::get_or_create_graphics_pipeline | ( | VKGraphicsInfo & | graphics_info, |
| bool | is_static_shader, | ||
| VkPipeline | vk_pipeline_base ) |
Get an existing or create a new compute pipeline based on the provided ComputeInfo.
When vk_pipeline_base is a valid pipeline handle, the pipeline base will be used to speed up pipeline creation process.
Definition at line 231 of file vk_pipeline_pool.cc.
References blender::gpu::VKGraphicsInfo::VertexIn::attributes, blender::gpu::VKGraphicsInfo::VertexIn::bindings, blender::gpu::GPUState::blend, BLI_assert, blender::gpu::VKGraphicsInfo::FragmentOut::color_attachment_formats, blender::gpu::VKGraphicsInfo::FragmentOut::color_attachment_size, blender::gpu::GPUState::culling_test, Vector< T, InlineBufferCapacity, Allocator >::data(), blender::gpu::VKGraphicsInfo::FragmentOut::depth_attachment_format, blender::gpu::GPUState::depth_test, blender::gpu::VKExtensions::descriptor_buffer, blender::gpu::VKBackend::device, ELEM, blender::gpu::VKDevice::extensions_get(), blender::gpu::VKGraphicsInfo::fragment_out, blender::gpu::VKGraphicsInfo::fragment_shader, blender::gpu::VKBackend::get(), GPU_BLEND_ADDITIVE, GPU_BLEND_ADDITIVE_PREMULT, GPU_BLEND_ALPHA, GPU_BLEND_ALPHA_PREMULT, GPU_BLEND_ALPHA_UNDER_PREMUL, GPU_BLEND_BACKGROUND, GPU_BLEND_CUSTOM, GPU_BLEND_INVERT, GPU_BLEND_MULTIPLY, GPU_BLEND_NONE, GPU_BLEND_OIT, GPU_BLEND_OVERLAY_MASK_FROM_ALPHA, GPU_BLEND_SUBTRACT, GPU_DEPTH_ALWAYS, GPU_DEPTH_EQUAL, GPU_DEPTH_GREATER, GPU_DEPTH_GREATER_EQUAL, GPU_DEPTH_LESS, GPU_DEPTH_LESS_EQUAL, GPU_DEPTH_NONE, GPU_STENCIL_ALWAYS, GPU_STENCIL_EQUAL, GPU_STENCIL_NEQUAL, GPU_STENCIL_NONE, GPU_STENCIL_OP_COUNT_DEPTH_FAIL, GPU_STENCIL_OP_COUNT_DEPTH_PASS, GPU_STENCIL_OP_NONE, GPU_STENCIL_OP_REPLACE, GPU_VERTEX_LAST, GPU_WRITE_ALPHA, GPU_WRITE_BLUE, GPU_WRITE_DEPTH, GPU_WRITE_GREEN, GPU_WRITE_RED, blender::gpu::GPUState::invert_facing, lock, blender::gpu::GPUState::logic_op_xor, blender::gpu::VKExtensions::logic_ops, blender::gpu::VKGraphicsInfo::mutable_state, blender::gpu::VKGraphicsInfo::pre_rasterization, blender::gpu::GPUState::provoking_vert, result, blender::gpu::VKGraphicsInfo::FragmentShader::scissors, blender::gpu::GPUState::shadow_bias, Vector< T, InlineBufferCapacity, Allocator >::size(), blender::gpu::VKGraphicsInfo::specialization_constants, blender::gpu::VKGraphicsInfo::state, blender::gpu::VKGraphicsInfo::FragmentOut::stencil_attachment_format, blender::gpu::GPUStateMutable::stencil_compare_mask, blender::gpu::GPUState::stencil_op, blender::gpu::GPUStateMutable::stencil_reference, blender::gpu::GPUState::stencil_test, blender::gpu::GPUStateMutable::stencil_write_mask, blender::gpu::to_vk_cull_mode_flags(), blender::gpu::VKGraphicsInfo::FragmentShader::update_hash(), blender::gpu::VKGraphicsInfo::vertex_in, blender::gpu::VKGraphicsInfo::FragmentShader::viewports, blender::gpu::VKGraphicsInfo::FragmentShader::vk_fragment_module, blender::gpu::VKGraphicsInfo::PreRasterization::vk_geometry_module, blender::gpu::VKDevice::vk_handle(), blender::gpu::VKGraphicsInfo::vk_pipeline_layout, blender::gpu::VKGraphicsInfo::VertexIn::vk_topology, blender::gpu::VKGraphicsInfo::PreRasterization::vk_vertex_module, VKDevice, and blender::gpu::GPUState::write_mask.
Referenced by blender::gpu::VKShader::ensure_and_get_graphics_pipeline().
| void blender::gpu::VKPipelinePool::init | ( | ) |
Definition at line 144 of file vk_pipeline_pool.cc.
References blender::gpu::VKBackend::device, blender::gpu::VKBackend::get(), blender::gpu::debug::object_label(), blender::gpu::VKDevice::vk_handle(), and VKDevice.
| void blender::gpu::VKPipelinePool::read_from_disk | ( | ) |
Read the static pipeline cache from cache file.
Pipeline caches requires blender to be build with WITH_BUILDINFO enabled . Between commits shader modules can change and shader module identifiers cannot be used. We use the build info to check if the identifiers can be reused.
Previous stored pipeline cache will not be read when G_DEBUG_GPU is enabled. In this case the shader modules will be compiled with other settings and any cached pipeline will not be used during this session.
NOTE: When developing shaders we assume that WITH_BUILDINFO is turned off or G_DEBUG_GPU flag is set.
Definition at line 735 of file vk_pipeline_pool.cc.
References BLI_exists(), BLI_file_touch(), CLOG_INFO, blender::gpu::VKBackend::device, G, G_DEBUG_GPU, blender::gpu::VKBackend::get(), blender::gpu::LOG, MEM_freeN(), MEM_mallocN(), blender::gpu::VKDevice::vk_handle(), and VKDevice.
| void blender::gpu::VKPipelinePool::write_to_disk | ( | ) |
Store the static pipeline cache to disk.
Pipeline caches requires blender to be build with WITH_BUILDINFO enabled . Between commits shader modules can change and shader module identifiers cannot be used. We use the build info to check if the identifiers can be reused.
The cache will not be written when G_DEBUG_GPU is active. In this case the shader modules have been generated with debug information and other compiler settings are used. This will clutter the pipeline cache.
NOTE: When developing shaders we assume that WITH_BUILDINFO is turned off or G_DEBUG_GPU flag is set.
Definition at line 790 of file vk_pipeline_pool.cc.
References CLOG_INFO, blender::gpu::VKBackend::device, G, G_DEBUG_GPU, blender::gpu::VKBackend::get(), blender::gpu::LOG, MEM_freeN(), MEM_mallocN(), blender::gpu::VKDevice::vk_handle(), and VKDevice.
|
friend |
Definition at line 248 of file vk_pipeline_pool.hh.
References VKDevice.
Referenced by free_data(), get_or_create_compute_pipeline(), get_or_create_graphics_pipeline(), init(), read_from_disk(), VKDevice, and write_to_disk().