anv: move trivial return shader to device
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8637>
This commit is contained in:

committed by
Marge Bot

parent
7c852f78c4
commit
fed7ac932f
@@ -3354,7 +3354,7 @@ VkResult anv_CreateDevice(
|
|||||||
anv_pipeline_cache_init(&device->default_pipeline_cache, device,
|
anv_pipeline_cache_init(&device->default_pipeline_cache, device,
|
||||||
true /* cache_enabled */, false /* external_sync */);
|
true /* cache_enabled */, false /* external_sync */);
|
||||||
|
|
||||||
result = anv_device_init_rt_trampoline(device);
|
result = anv_device_init_rt_shaders(device);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
goto fail_rt_trampoline;
|
goto fail_rt_trampoline;
|
||||||
|
|
||||||
|
@@ -2479,32 +2479,6 @@ compile_upload_rt_shader(struct anv_ray_tracing_pipeline *pipeline,
|
|||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VkResult
|
|
||||||
compile_trivial_return_shader(struct anv_ray_tracing_pipeline *pipeline)
|
|
||||||
{
|
|
||||||
const struct brw_compiler *compiler =
|
|
||||||
pipeline->base.device->physical->compiler;
|
|
||||||
|
|
||||||
assert(pipeline->trivial_return_shader == NULL);
|
|
||||||
|
|
||||||
void *mem_ctx = ralloc_context(NULL);
|
|
||||||
|
|
||||||
nir_shader *nir = brw_nir_create_trivial_return_shader(compiler, mem_ctx);
|
|
||||||
|
|
||||||
struct anv_pipeline_stage stage = {
|
|
||||||
.stage = nir->info.stage,
|
|
||||||
.nir = nir,
|
|
||||||
};
|
|
||||||
|
|
||||||
VkResult result =
|
|
||||||
compile_upload_rt_shader(pipeline, stage.nir, &stage,
|
|
||||||
&pipeline->trivial_return_shader, mem_ctx);
|
|
||||||
|
|
||||||
ralloc_free(mem_ctx);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
is_rt_stack_size_dynamic(const VkRayTracingPipelineCreateInfoKHR *info)
|
is_rt_stack_size_dynamic(const VkRayTracingPipelineCreateInfoKHR *info)
|
||||||
{
|
{
|
||||||
@@ -2586,8 +2560,6 @@ anv_pipeline_compile_ray_tracing(struct anv_ray_tracing_pipeline *pipeline,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compile_trivial_return_shader(pipeline);
|
|
||||||
|
|
||||||
uint32_t stack_max[MESA_VULKAN_SHADER_STAGES] = {};
|
uint32_t stack_max[MESA_VULKAN_SHADER_STAGES] = {};
|
||||||
|
|
||||||
for (uint32_t i = 0; i < info->stageCount; i++) {
|
for (uint32_t i = 0; i < info->stageCount; i++) {
|
||||||
@@ -2769,7 +2741,7 @@ anv_pipeline_compile_ray_tracing(struct anv_ray_tracing_pipeline *pipeline,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VkResult
|
VkResult
|
||||||
anv_device_init_rt_trampoline(struct anv_device *device)
|
anv_device_init_rt_shaders(struct anv_device *device)
|
||||||
{
|
{
|
||||||
if (!device->vk.enabled_extensions.KHR_ray_tracing_pipeline)
|
if (!device->vk.enabled_extensions.KHR_ray_tracing_pipeline)
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
@@ -2832,6 +2804,49 @@ anv_device_init_rt_trampoline(struct anv_device *device)
|
|||||||
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct brw_rt_trivial_return {
|
||||||
|
char name[16];
|
||||||
|
struct brw_bs_prog_key key;
|
||||||
|
} return_key = {
|
||||||
|
.name = "rt-trivial-ret",
|
||||||
|
};
|
||||||
|
device->rt_trivial_return =
|
||||||
|
anv_device_search_for_kernel(device, &device->default_pipeline_cache,
|
||||||
|
&return_key, sizeof(return_key),
|
||||||
|
&cache_hit);
|
||||||
|
if (device->rt_trivial_return == NULL) {
|
||||||
|
void *tmp_ctx = ralloc_context(NULL);
|
||||||
|
nir_shader *trivial_return_nir =
|
||||||
|
brw_nir_create_trivial_return_shader(device->physical->compiler, tmp_ctx);
|
||||||
|
|
||||||
|
NIR_PASS_V(trivial_return_nir, brw_nir_lower_rt_intrinsics, &device->info);
|
||||||
|
|
||||||
|
struct anv_pipeline_bind_map bind_map = {
|
||||||
|
.surface_count = 0,
|
||||||
|
.sampler_count = 0,
|
||||||
|
};
|
||||||
|
struct brw_bs_prog_data return_prog_data = { 0, };
|
||||||
|
const unsigned *return_data =
|
||||||
|
brw_compile_bs(device->physical->compiler, device, tmp_ctx,
|
||||||
|
&return_key.key, &return_prog_data, trivial_return_nir,
|
||||||
|
0, 0, NULL, NULL);
|
||||||
|
|
||||||
|
device->rt_trivial_return =
|
||||||
|
anv_device_upload_kernel(device, &device->default_pipeline_cache,
|
||||||
|
MESA_SHADER_CALLABLE,
|
||||||
|
&return_key, sizeof(return_key),
|
||||||
|
return_data, return_prog_data.base.program_size,
|
||||||
|
&return_prog_data.base, sizeof(return_prog_data),
|
||||||
|
NULL, 0, NULL, &bind_map);
|
||||||
|
|
||||||
|
ralloc_free(tmp_ctx);
|
||||||
|
|
||||||
|
if (device->rt_trivial_return == NULL) {
|
||||||
|
anv_shader_bin_unref(device, device->rt_trampoline);
|
||||||
|
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2856,7 +2871,6 @@ anv_ray_tracing_pipeline_init(struct anv_ray_tracing_pipeline *pipeline,
|
|||||||
/* Zero things out so our clean-up works */
|
/* Zero things out so our clean-up works */
|
||||||
memset(pipeline->groups, 0,
|
memset(pipeline->groups, 0,
|
||||||
pipeline->group_count * sizeof(*pipeline->groups));
|
pipeline->group_count * sizeof(*pipeline->groups));
|
||||||
pipeline->trivial_return_shader = NULL;
|
|
||||||
|
|
||||||
util_dynarray_init(&pipeline->shaders, pipeline->base.mem_ctx);
|
util_dynarray_init(&pipeline->shaders, pipeline->base.mem_ctx);
|
||||||
|
|
||||||
|
@@ -1242,6 +1242,7 @@ struct anv_device {
|
|||||||
struct anv_bo *rt_scratch_bos[16];
|
struct anv_bo *rt_scratch_bos[16];
|
||||||
|
|
||||||
struct anv_shader_bin *rt_trampoline;
|
struct anv_shader_bin *rt_trampoline;
|
||||||
|
struct anv_shader_bin *rt_trivial_return;
|
||||||
|
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
pthread_cond_t queue_submit;
|
pthread_cond_t queue_submit;
|
||||||
@@ -3612,9 +3613,6 @@ struct anv_ray_tracing_pipeline {
|
|||||||
/* All shaders in the pipeline */
|
/* All shaders in the pipeline */
|
||||||
struct util_dynarray shaders;
|
struct util_dynarray shaders;
|
||||||
|
|
||||||
/* Dummy stack return shader */
|
|
||||||
struct anv_shader_bin * trivial_return_shader;
|
|
||||||
|
|
||||||
uint32_t group_count;
|
uint32_t group_count;
|
||||||
struct anv_rt_shader_group * groups;
|
struct anv_rt_shader_group * groups;
|
||||||
|
|
||||||
@@ -3681,7 +3679,7 @@ anv_pipeline_get_last_vue_prog_data(const struct anv_graphics_pipeline *pipeline
|
|||||||
}
|
}
|
||||||
|
|
||||||
VkResult
|
VkResult
|
||||||
anv_device_init_rt_trampoline(struct anv_device *device);
|
anv_device_init_rt_shaders(struct anv_device *device);
|
||||||
|
|
||||||
void
|
void
|
||||||
anv_device_finish_rt_shaders(struct anv_device *device);
|
anv_device_finish_rt_shaders(struct anv_device *device);
|
||||||
|
@@ -5017,7 +5017,7 @@ cmd_buffer_trace_rays(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
.offset = rt->scratch.layout.ray_stack_start,
|
.offset = rt->scratch.layout.ray_stack_start,
|
||||||
},
|
},
|
||||||
.CallStackHandler =
|
.CallStackHandler =
|
||||||
anv_shader_bin_get_bsr(pipeline->trivial_return_shader, 0),
|
anv_shader_bin_get_bsr(cmd_buffer->device->rt_trivial_return, 0),
|
||||||
.AsyncRTStackSize = rt->scratch.layout.ray_stack_stride / 64,
|
.AsyncRTStackSize = rt->scratch.layout.ray_stack_stride / 64,
|
||||||
.NumDSSRTStacks = rt->scratch.layout.stack_ids_per_dss,
|
.NumDSSRTStacks = rt->scratch.layout.stack_ids_per_dss,
|
||||||
.MaxBVHLevels = BRW_RT_MAX_BVH_LEVELS,
|
.MaxBVHLevels = BRW_RT_MAX_BVH_LEVELS,
|
||||||
|
Reference in New Issue
Block a user