1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat. 3*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen 4*61046927SAndroid Build Coastguard Worker * 5*61046927SAndroid Build Coastguard Worker * based in part on anv driver which is: 6*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation 7*61046927SAndroid Build Coastguard Worker * 8*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 9*61046927SAndroid Build Coastguard Worker */ 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker #ifndef RADV_PIPELINE_H 12*61046927SAndroid Build Coastguard Worker #define RADV_PIPELINE_H 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Worker #include "util/mesa-sha1.h" 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker #include "nir.h" 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Worker #include "vk_pipeline.h" 19*61046927SAndroid Build Coastguard Worker #include "vk_pipeline_cache.h" 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Worker #include "radv_radeon_winsys.h" 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Worker struct radv_device; 24*61046927SAndroid Build Coastguard Worker struct radv_shader_stage_key; 25*61046927SAndroid Build Coastguard Worker struct radv_shader_stage; 26*61046927SAndroid Build Coastguard Worker struct radv_pipeline_layout; 27*61046927SAndroid Build Coastguard Worker struct radv_graphics_state_key; 28*61046927SAndroid Build Coastguard Worker struct radv_shader_layout; 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker enum radv_pipeline_type { 31*61046927SAndroid Build Coastguard Worker RADV_PIPELINE_GRAPHICS, 32*61046927SAndroid Build Coastguard Worker RADV_PIPELINE_GRAPHICS_LIB, 33*61046927SAndroid Build Coastguard Worker /* Compute pipeline */ 34*61046927SAndroid Build Coastguard Worker RADV_PIPELINE_COMPUTE, 35*61046927SAndroid Build Coastguard Worker /* Raytracing pipeline */ 36*61046927SAndroid Build Coastguard Worker RADV_PIPELINE_RAY_TRACING, 37*61046927SAndroid Build Coastguard Worker RADV_PIPELINE_TYPE_COUNT, 38*61046927SAndroid Build Coastguard Worker }; 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker struct radv_pipeline { 41*61046927SAndroid Build Coastguard Worker struct vk_object_base base; 42*61046927SAndroid Build Coastguard Worker uint8_t sha1[SHA1_DIGEST_LENGTH]; 43*61046927SAndroid Build Coastguard Worker enum radv_pipeline_type type; 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker VkPipelineCreateFlags2KHR create_flags; 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Worker struct vk_pipeline_cache_object *cache_object; 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker bool is_internal; 50*61046927SAndroid Build Coastguard Worker bool need_indirect_descriptor_sets; 51*61046927SAndroid Build Coastguard Worker struct radv_shader *shaders[MESA_VULKAN_SHADER_STAGES]; 52*61046927SAndroid Build Coastguard Worker struct radv_shader *gs_copy_shader; 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker uint32_t user_data_0[MESA_VULKAN_SHADER_STAGES]; 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker /* Unique pipeline hash identifier. */ 57*61046927SAndroid Build Coastguard Worker uint64_t pipeline_hash; 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Worker /* Pipeline layout info. */ 60*61046927SAndroid Build Coastguard Worker uint32_t push_constant_size; 61*61046927SAndroid Build Coastguard Worker uint32_t dynamic_offset_count; 62*61046927SAndroid Build Coastguard Worker }; 63*61046927SAndroid Build Coastguard Worker 64*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline, base, VkPipeline, VK_OBJECT_TYPE_PIPELINE) 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker #define RADV_DECL_PIPELINE_DOWNCAST(pipe_type, pipe_enum) \ 67*61046927SAndroid Build Coastguard Worker static inline struct radv_##pipe_type##_pipeline *radv_pipeline_to_##pipe_type(struct radv_pipeline *pipeline) \ 68*61046927SAndroid Build Coastguard Worker { \ 69*61046927SAndroid Build Coastguard Worker assert(pipeline->type == pipe_enum); \ 70*61046927SAndroid Build Coastguard Worker return (struct radv_##pipe_type##_pipeline *)pipeline; \ 71*61046927SAndroid Build Coastguard Worker } 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker bool radv_pipeline_capture_shaders(const struct radv_device *device, VkPipelineCreateFlags2KHR flags); 74*61046927SAndroid Build Coastguard Worker 75*61046927SAndroid Build Coastguard Worker bool radv_shader_need_indirect_descriptor_sets(const struct radv_shader *shader); 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker bool radv_pipeline_capture_shader_stats(const struct radv_device *device, VkPipelineCreateFlags2KHR flags); 78*61046927SAndroid Build Coastguard Worker 79*61046927SAndroid Build Coastguard Worker void radv_pipeline_init(struct radv_device *device, struct radv_pipeline *pipeline, enum radv_pipeline_type type); 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard Worker void radv_pipeline_destroy(struct radv_device *device, struct radv_pipeline *pipeline, 82*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *allocator); 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker struct radv_shader_stage_key radv_pipeline_get_shader_key(const struct radv_device *device, 85*61046927SAndroid Build Coastguard Worker const VkPipelineShaderStageCreateInfo *stage, 86*61046927SAndroid Build Coastguard Worker VkPipelineCreateFlags2KHR flags, const void *pNext); 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard Worker void radv_pipeline_stage_init(VkPipelineCreateFlags2KHR pipeline_flags, 89*61046927SAndroid Build Coastguard Worker const VkPipelineShaderStageCreateInfo *sinfo, const struct radv_pipeline_layout *layout, 90*61046927SAndroid Build Coastguard Worker const struct radv_shader_stage_key *stage_key, struct radv_shader_stage *out_stage); 91*61046927SAndroid Build Coastguard Worker 92*61046927SAndroid Build Coastguard Worker void radv_shader_layout_init(const struct radv_pipeline_layout *pipeline_layout, gl_shader_stage stage, 93*61046927SAndroid Build Coastguard Worker struct radv_shader_layout *layout); 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker void radv_postprocess_nir(struct radv_device *device, const struct radv_graphics_state_key *gfx_state, 96*61046927SAndroid Build Coastguard Worker struct radv_shader_stage *stage); 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker bool radv_shader_should_clear_lds(const struct radv_device *device, const nir_shader *shader); 99*61046927SAndroid Build Coastguard Worker 100*61046927SAndroid Build Coastguard Worker VkPipelineShaderStageCreateInfo *radv_copy_shader_stage_create_info(struct radv_device *device, uint32_t stageCount, 101*61046927SAndroid Build Coastguard Worker const VkPipelineShaderStageCreateInfo *pStages, 102*61046927SAndroid Build Coastguard Worker void *mem_ctx); 103*61046927SAndroid Build Coastguard Worker 104*61046927SAndroid Build Coastguard Worker void radv_pipeline_hash(const struct radv_device *device, const struct radv_pipeline_layout *pipeline_layout, 105*61046927SAndroid Build Coastguard Worker struct mesa_sha1 *ctx); 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker void radv_pipeline_hash_shader_stage(VkPipelineCreateFlags2KHR pipeline_flags, 108*61046927SAndroid Build Coastguard Worker const VkPipelineShaderStageCreateInfo *sinfo, 109*61046927SAndroid Build Coastguard Worker const struct radv_shader_stage_key *stage_key, struct mesa_sha1 *ctx); 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Worker #endif /* RADV_PIPELINE_H */ 112