xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/genX_internal_kernels.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /* Copyright © 2023 Intel Corporation
2  * SPDX-License-Identifier: MIT
3  */
4 
5 #include "anv_private.h"
6 #include "anv_internal_kernels.h"
7 
8 #include "compiler/nir/nir_builder.h"
9 #include "compiler/nir/nir_serialize.h"
10 
11 #if GFX_VERx10 == 90
12 # include "intel_gfx9_shaders_code.h"
13 #elif GFX_VERx10 == 110
14 # include "intel_gfx11_shaders_code.h"
15 #elif GFX_VERx10 == 120
16 # include "intel_gfx12_shaders_code.h"
17 #elif GFX_VERx10 == 125
18 # include "intel_gfx125_shaders_code.h"
19 #elif GFX_VERx10 == 200
20 # include "intel_gfx20_shaders_code.h"
21 #else
22 # error "Unsupported generation"
23 #endif
24 
25 #include "genxml/gen_macros.h"
26 
27 #define load_param(b, bit_size, struct_name, field_name)          \
28    nir_load_uniform(b, 1, bit_size, nir_imm_int(b, 0),            \
29                     .base = offsetof(struct_name, field_name),   \
30                     .range = bit_size / 8)
31 
32 static nir_def *
load_fragment_index(nir_builder * b)33 load_fragment_index(nir_builder *b)
34 {
35    nir_def *pos_in = nir_f2i32(b, nir_trim_vector(b, nir_load_frag_coord(b), 2));
36    return nir_iadd(b,
37                    nir_imul_imm(b, nir_channel(b, pos_in, 1), 8192),
38                    nir_channel(b, pos_in, 0));
39 }
40 
41 static nir_def *
load_compute_index(nir_builder * b)42 load_compute_index(nir_builder *b)
43 {
44    return nir_channel(b, nir_load_global_invocation_id(b, 32), 0);
45 }
46 
47 nir_shader *
genX(load_libanv_shader)48 genX(load_libanv_shader)(struct anv_device *device, void *mem_ctx)
49 {
50    const nir_shader_compiler_options *nir_options =
51       device->physical->compiler->nir_options[MESA_SHADER_KERNEL];
52 
53    struct blob_reader blob;
54    blob_reader_init(&blob, (void *)genX(intel_shaders_nir),
55                     sizeof(genX(intel_shaders_nir)));
56    return nir_deserialize(mem_ctx, nir_options, &blob);
57 }
58 
59 uint32_t
genX(call_internal_shader)60 genX(call_internal_shader)(nir_builder *b, enum anv_internal_kernel_name shader_name)
61 {
62    switch (shader_name) {
63    case ANV_INTERNAL_KERNEL_GENERATED_DRAWS:
64       genX(libanv_write_draw)(
65          b,
66          load_param(b, 64, struct anv_gen_indirect_params, generated_cmds_addr),
67          load_param(b, 64, struct anv_gen_indirect_params, indirect_data_addr),
68          load_param(b, 64, struct anv_gen_indirect_params, draw_id_addr),
69          load_param(b, 32, struct anv_gen_indirect_params, indirect_data_stride),
70          load_param(b, 64, struct anv_gen_indirect_params, draw_count_addr),
71          load_param(b, 32, struct anv_gen_indirect_params, draw_base),
72          load_param(b, 32, struct anv_gen_indirect_params, instance_multiplier),
73          load_param(b, 32, struct anv_gen_indirect_params, max_draw_count),
74          load_param(b, 32, struct anv_gen_indirect_params, flags),
75          load_param(b, 32, struct anv_gen_indirect_params, ring_count),
76          load_param(b, 64, struct anv_gen_indirect_params, gen_addr),
77          load_param(b, 64, struct anv_gen_indirect_params, end_addr),
78          load_fragment_index(b));
79       return sizeof(struct anv_gen_indirect_params);
80 
81    case ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_COMPUTE:
82    case ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_FRAGMENT:
83       genX(libanv_query_copy)(
84          b,
85          load_param(b, 64, struct anv_query_copy_params, destination_addr),
86          load_param(b, 32, struct anv_query_copy_params, destination_stride),
87          load_param(b, 64, struct anv_query_copy_params, query_data_addr),
88          load_param(b, 32, struct anv_query_copy_params, query_base),
89          load_param(b, 32, struct anv_query_copy_params, num_queries),
90          load_param(b, 32, struct anv_query_copy_params, query_data_offset),
91          load_param(b, 32, struct anv_query_copy_params, query_stride),
92          load_param(b, 32, struct anv_query_copy_params, num_items),
93          load_param(b, 32, struct anv_query_copy_params, flags),
94          shader_name == ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_COMPUTE ?
95          load_compute_index(b) : load_fragment_index(b));
96       return sizeof(struct anv_query_copy_params);
97 
98    case ANV_INTERNAL_KERNEL_MEMCPY_COMPUTE:
99       genX(libanv_memcpy)(
100          b,
101          load_param(b, 64, struct anv_memcpy_params, dst_addr),
102          load_param(b, 64, struct anv_memcpy_params, src_addr),
103          load_param(b, 32, struct anv_memcpy_params, num_dwords),
104          nir_imul_imm(b, load_compute_index(b), 4));
105       return sizeof(struct anv_memcpy_params);
106 
107    default:
108       unreachable("Invalid shader name");
109       break;
110    }
111 }
112