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 #elif GFX_VERx10 == 300
22 # include "intel_gfx30_shaders_code.h"
23 #else
24 # error "Unsupported generation"
25 #endif
26
27 #include "genxml/gen_macros.h"
28
29 #define load_param(b, bit_size, struct_name, field_name) \
30 nir_load_uniform(b, 1, bit_size, nir_imm_int(b, 0), \
31 .base = offsetof(struct_name, field_name), \
32 .range = bit_size / 8)
33
34 static nir_def *
load_fragment_index(nir_builder * b)35 load_fragment_index(nir_builder *b)
36 {
37 nir_def *pos_in = nir_f2i32(b, nir_trim_vector(b, nir_load_frag_coord(b), 2));
38 return nir_iadd(b,
39 nir_imul_imm(b, nir_channel(b, pos_in, 1), 8192),
40 nir_channel(b, pos_in, 0));
41 }
42
43 static nir_def *
load_compute_index(nir_builder * b)44 load_compute_index(nir_builder *b)
45 {
46 return nir_channel(b, nir_load_global_invocation_id(b, 32), 0);
47 }
48
49 nir_shader *
genX(load_libanv_shader)50 genX(load_libanv_shader)(struct anv_device *device, void *mem_ctx)
51 {
52 const nir_shader_compiler_options *nir_options =
53 device->physical->compiler->nir_options[MESA_SHADER_KERNEL];
54
55 struct blob_reader blob;
56 blob_reader_init(&blob, (void *)genX(intel_shaders_nir),
57 sizeof(genX(intel_shaders_nir)));
58 return nir_deserialize(mem_ctx, nir_options, &blob);
59 }
60
61 uint32_t
genX(call_internal_shader)62 genX(call_internal_shader)(nir_builder *b, enum anv_internal_kernel_name shader_name)
63 {
64 switch (shader_name) {
65 case ANV_INTERNAL_KERNEL_GENERATED_DRAWS:
66 genX(libanv_write_draw)(
67 b,
68 load_param(b, 64, struct anv_gen_indirect_params, generated_cmds_addr),
69 load_param(b, 64, struct anv_gen_indirect_params, wa_insts_addr),
70 load_param(b, 64, struct anv_gen_indirect_params, indirect_data_addr),
71 load_param(b, 64, struct anv_gen_indirect_params, draw_id_addr),
72 load_param(b, 32, struct anv_gen_indirect_params, indirect_data_stride),
73 load_param(b, 64, struct anv_gen_indirect_params, draw_count_addr),
74 load_param(b, 32, struct anv_gen_indirect_params, draw_base),
75 load_param(b, 32, struct anv_gen_indirect_params, instance_multiplier),
76 load_param(b, 32, struct anv_gen_indirect_params, max_draw_count),
77 load_param(b, 32, struct anv_gen_indirect_params, flags),
78 load_param(b, 32, struct anv_gen_indirect_params, mocs),
79 load_param(b, 32, struct anv_gen_indirect_params, cmd_primitive_size),
80 load_param(b, 32, struct anv_gen_indirect_params, ring_count),
81 load_param(b, 64, struct anv_gen_indirect_params, gen_addr),
82 load_param(b, 64, struct anv_gen_indirect_params, end_addr),
83 load_fragment_index(b));
84 return sizeof(struct anv_gen_indirect_params);
85
86 case ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_COMPUTE:
87 case ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_FRAGMENT:
88 genX(libanv_query_copy)(
89 b,
90 load_param(b, 64, struct anv_query_copy_params, destination_addr),
91 load_param(b, 32, struct anv_query_copy_params, destination_stride),
92 load_param(b, 64, struct anv_query_copy_params, query_data_addr),
93 load_param(b, 32, struct anv_query_copy_params, query_base),
94 load_param(b, 32, struct anv_query_copy_params, num_queries),
95 load_param(b, 32, struct anv_query_copy_params, query_data_offset),
96 load_param(b, 32, struct anv_query_copy_params, query_stride),
97 load_param(b, 32, struct anv_query_copy_params, num_items),
98 load_param(b, 32, struct anv_query_copy_params, flags),
99 shader_name == ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_COMPUTE ?
100 load_compute_index(b) : load_fragment_index(b));
101 return sizeof(struct anv_query_copy_params);
102
103 case ANV_INTERNAL_KERNEL_MEMCPY_COMPUTE:
104 genX(libanv_memcpy)(
105 b,
106 load_param(b, 64, struct anv_memcpy_params, dst_addr),
107 load_param(b, 64, struct anv_memcpy_params, src_addr),
108 load_param(b, 32, struct anv_memcpy_params, num_dwords),
109 nir_imul_imm(b, load_compute_index(b), 4));
110 return sizeof(struct anv_memcpy_params);
111
112 default:
113 unreachable("Invalid shader name");
114 break;
115 }
116 }
117