• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_gfx90_shaders_spv.h"
13 # include "intel_gfx90_shaders_binding.h"
14 #elif GFX_VERx10 == 110
15 # include "intel_gfx110_shaders_spv.h"
16 # include "intel_gfx110_shaders_binding.h"
17 #elif GFX_VERx10 == 120
18 # include "intel_gfx120_shaders_spv.h"
19 # include "intel_gfx120_shaders_binding.h"
20 #elif GFX_VERx10 == 125
21 # include "intel_gfx125_shaders_spv.h"
22 # include "intel_gfx125_shaders_binding.h"
23 #elif GFX_VERx10 == 200
24 # include "intel_gfx200_shaders_spv.h"
25 # include "intel_gfx200_shaders_binding.h"
26 #elif GFX_VERx10 == 300
27 # include "intel_gfx300_shaders_spv.h"
28 # include "intel_gfx300_shaders_binding.h"
29 #else
30 # error "Unsupported generation"
31 #endif
32 
33 #include "genxml/gen_macros.h"
34 
35 #define load_param(b, bit_size, struct_name, field_name)          \
36    nir_load_uniform(b, 1, bit_size, nir_imm_int(b, 0),            \
37                     .base = offsetof(struct_name, field_name),   \
38                     .range = bit_size / 8)
39 
40 const uint32_t *
genX(libanv_spv)41 genX(libanv_spv)(uint32_t *out_size)
42 {
43    *out_size = sizeof(genX(shaders_spv));
44    return genX(shaders_spv);
45 }
46 
47 static nir_def *
load_fragment_index(nir_builder * b)48 load_fragment_index(nir_builder *b)
49 {
50    nir_def *pos_in = nir_f2i32(b, nir_trim_vector(b, nir_load_frag_coord(b), 2));
51    return nir_iadd(b,
52                    nir_imul_imm(b, nir_channel(b, pos_in, 1), 8192),
53                    nir_channel(b, pos_in, 0));
54 }
55 
56 static nir_def *
load_compute_index(nir_builder * b)57 load_compute_index(nir_builder *b)
58 {
59    return nir_channel(b, nir_load_global_invocation_id(b, 32), 0);
60 }
61 
62 uint32_t
genX(call_internal_shader)63 genX(call_internal_shader)(nir_builder *b, enum anv_internal_kernel_name shader_name)
64 {
65    switch (shader_name) {
66    case ANV_INTERNAL_KERNEL_GENERATED_DRAWS:
67       genX(libanv_write_draw)(
68          b,
69          load_param(b, 64, struct anv_gen_indirect_params, generated_cmds_addr),
70          load_param(b, 64, struct anv_gen_indirect_params, wa_insts_addr),
71          load_param(b, 64, struct anv_gen_indirect_params, indirect_data_addr),
72          load_param(b, 64, struct anv_gen_indirect_params, draw_id_addr),
73          load_param(b, 32, struct anv_gen_indirect_params, indirect_data_stride),
74          load_param(b, 64, struct anv_gen_indirect_params, draw_count_addr),
75          load_param(b, 32, struct anv_gen_indirect_params, draw_base),
76          load_param(b, 32, struct anv_gen_indirect_params, instance_multiplier),
77          load_param(b, 32, struct anv_gen_indirect_params, max_draw_count),
78          load_param(b, 32, struct anv_gen_indirect_params, flags),
79          load_param(b, 32, struct anv_gen_indirect_params, mocs),
80          load_param(b, 32, struct anv_gen_indirect_params, cmd_primitive_size),
81          load_param(b, 32, struct anv_gen_indirect_params, ring_count),
82          load_param(b, 64, struct anv_gen_indirect_params, gen_addr),
83          load_param(b, 64, struct anv_gen_indirect_params, end_addr),
84          load_fragment_index(b));
85       return sizeof(struct anv_gen_indirect_params);
86 
87    case ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_COMPUTE:
88    case ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_FRAGMENT:
89       genX(libanv_query_copy)(
90          b,
91          load_param(b, 64, struct anv_query_copy_params, destination_addr),
92          load_param(b, 32, struct anv_query_copy_params, destination_stride),
93          load_param(b, 64, struct anv_query_copy_params, query_data_addr),
94          load_param(b, 32, struct anv_query_copy_params, query_base),
95          load_param(b, 32, struct anv_query_copy_params, num_queries),
96          load_param(b, 32, struct anv_query_copy_params, query_data_offset),
97          load_param(b, 32, struct anv_query_copy_params, query_stride),
98          load_param(b, 32, struct anv_query_copy_params, num_items),
99          load_param(b, 32, struct anv_query_copy_params, flags),
100          shader_name == ANV_INTERNAL_KERNEL_COPY_QUERY_RESULTS_COMPUTE ?
101          load_compute_index(b) : load_fragment_index(b));
102       return sizeof(struct anv_query_copy_params);
103 
104    case ANV_INTERNAL_KERNEL_MEMCPY_COMPUTE:
105       genX(libanv_memcpy)(
106          b,
107          load_param(b, 64, struct anv_memcpy_params, dst_addr),
108          load_param(b, 64, struct anv_memcpy_params, src_addr),
109          load_param(b, 32, struct anv_memcpy_params, num_dwords),
110          nir_imul_imm(b, load_compute_index(b), 4));
111       return sizeof(struct anv_memcpy_params);
112 
113    default:
114       unreachable("Invalid shader name");
115       break;
116    }
117 }
118