xref: /aosp_15_r20/external/mesa3d/src/imagination/vulkan/pvr_hardcode.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Imagination Technologies Ltd.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
5*61046927SAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to deal
6*61046927SAndroid Build Coastguard Worker  * in the Software without restriction, including without limitation the rights
7*61046927SAndroid Build Coastguard Worker  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*61046927SAndroid Build Coastguard Worker  * copies of the Software, and to permit persons to whom the Software is
9*61046927SAndroid Build Coastguard Worker  * furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18*61046927SAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
25*61046927SAndroid Build Coastguard Worker #include <stddef.h>
26*61046927SAndroid Build Coastguard Worker #include <stdint.h>
27*61046927SAndroid Build Coastguard Worker #include <string.h>
28*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan_core.h>
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include "compiler/shader_enums.h"
31*61046927SAndroid Build Coastguard Worker #include "hwdef/rogue_hw_utils.h"
32*61046927SAndroid Build Coastguard Worker #include "pvr_device_info.h"
33*61046927SAndroid Build Coastguard Worker #include "pvr_hardcode.h"
34*61046927SAndroid Build Coastguard Worker #include "pvr_private.h"
35*61046927SAndroid Build Coastguard Worker #include "rogue/rogue.h"
36*61046927SAndroid Build Coastguard Worker #include "usc/hardcoded_apps/pvr_simple_compute.h"
37*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
38*61046927SAndroid Build Coastguard Worker #include "util/u_dynarray.h"
39*61046927SAndroid Build Coastguard Worker #include "util/u_process.h"
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker /**
42*61046927SAndroid Build Coastguard Worker  * \file pvr_hardcode.c
43*61046927SAndroid Build Coastguard Worker  *
44*61046927SAndroid Build Coastguard Worker  * \brief Contains hard coding functions.
45*61046927SAndroid Build Coastguard Worker  * This should eventually be deleted as the compiler becomes more capable.
46*61046927SAndroid Build Coastguard Worker  */
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker #define PVR_AXE_1_16M_BVNC PVR_BVNC_PACK(33, 15, 11, 3)
49*61046927SAndroid Build Coastguard Worker #define PVR_GX6250_BVNC PVR_BVNC_PACK(4, 40, 2, 51)
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker #define util_dynarray_append_mem(buf, size, mem) \
52*61046927SAndroid Build Coastguard Worker    memcpy(util_dynarray_grow_bytes((buf), 1, size), mem, size)
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker enum pvr_hard_code_shader_type {
55*61046927SAndroid Build Coastguard Worker    PVR_HARD_CODE_SHADER_TYPE_COMPUTE,
56*61046927SAndroid Build Coastguard Worker    PVR_HARD_CODE_SHADER_TYPE_GRAPHICS,
57*61046927SAndroid Build Coastguard Worker };
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker static const struct pvr_hard_coding_data {
60*61046927SAndroid Build Coastguard Worker    const char *const name;
61*61046927SAndroid Build Coastguard Worker    uint64_t bvnc;
62*61046927SAndroid Build Coastguard Worker    enum pvr_hard_code_shader_type type;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    union {
65*61046927SAndroid Build Coastguard Worker       struct {
66*61046927SAndroid Build Coastguard Worker          const uint8_t *const shader;
67*61046927SAndroid Build Coastguard Worker          size_t shader_size;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker          /* Note that the bo field will be unused. */
70*61046927SAndroid Build Coastguard Worker          const struct pvr_compute_shader_state shader_info;
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker          const struct pvr_hard_code_compute_build_info build_info;
73*61046927SAndroid Build Coastguard Worker       } compute;
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker       struct {
76*61046927SAndroid Build Coastguard Worker          /* Mask of MESA_SHADER_* (gl_shader_stage). */
77*61046927SAndroid Build Coastguard Worker          uint32_t flags;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker          uint8_t *const *const vert_shaders;
80*61046927SAndroid Build Coastguard Worker          unsigned *vert_shader_sizes;
81*61046927SAndroid Build Coastguard Worker          uint8_t *const *const frag_shaders;
82*61046927SAndroid Build Coastguard Worker          unsigned *frag_shader_sizes;
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker          const struct pvr_vertex_shader_state *const *const vert_shader_states;
85*61046927SAndroid Build Coastguard Worker          const struct pvr_fragment_shader_state *const *const frag_shader_states;
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker          const struct pvr_hard_code_graphics_build_info *const
88*61046927SAndroid Build Coastguard Worker             *const build_infos;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker          uint32_t shader_count;
91*61046927SAndroid Build Coastguard Worker       } graphics;
92*61046927SAndroid Build Coastguard Worker    };
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker } hard_coding_table[] = {
95*61046927SAndroid Build Coastguard Worker    {
96*61046927SAndroid Build Coastguard Worker       .name = "simple-compute",
97*61046927SAndroid Build Coastguard Worker       .bvnc = PVR_GX6250_BVNC,
98*61046927SAndroid Build Coastguard Worker       .type = PVR_HARD_CODE_SHADER_TYPE_COMPUTE,
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker       .compute = {
101*61046927SAndroid Build Coastguard Worker          .shader = pvr_simple_compute_shader,
102*61046927SAndroid Build Coastguard Worker          .shader_size = sizeof(pvr_simple_compute_shader),
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker          .shader_info = {
105*61046927SAndroid Build Coastguard Worker             .uses_atomic_ops = false,
106*61046927SAndroid Build Coastguard Worker             .uses_barrier = false,
107*61046927SAndroid Build Coastguard Worker             .uses_num_workgroups = false,
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker             .const_shared_reg_count = 4,
110*61046927SAndroid Build Coastguard Worker             .input_register_count = 8,
111*61046927SAndroid Build Coastguard Worker             .work_size = 1 * 1 * 1,
112*61046927SAndroid Build Coastguard Worker             .coefficient_register_count = 4,
113*61046927SAndroid Build Coastguard Worker          },
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker          .build_info = {
116*61046927SAndroid Build Coastguard Worker             .ubo_data = { 0 },
117*61046927SAndroid Build Coastguard Worker             .compile_time_consts_data = {
118*61046927SAndroid Build Coastguard Worker                .static_consts = { 0 },
119*61046927SAndroid Build Coastguard Worker             },
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker             .local_invocation_regs = { 0, 1 },
122*61046927SAndroid Build Coastguard Worker             .work_group_regs = { 0, 1, 2 },
123*61046927SAndroid Build Coastguard Worker             .barrier_reg = ROGUE_REG_UNUSED,
124*61046927SAndroid Build Coastguard Worker             .usc_temps = 0,
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker             .explicit_conts_usage = {
127*61046927SAndroid Build Coastguard Worker                .start_offset = 0,
128*61046927SAndroid Build Coastguard Worker             },
129*61046927SAndroid Build Coastguard Worker          },
130*61046927SAndroid Build Coastguard Worker       }
131*61046927SAndroid Build Coastguard Worker    },
132*61046927SAndroid Build Coastguard Worker };
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker static inline uint64_t
pvr_device_get_bvnc(const struct pvr_device_info * const dev_info)135*61046927SAndroid Build Coastguard Worker pvr_device_get_bvnc(const struct pvr_device_info *const dev_info)
136*61046927SAndroid Build Coastguard Worker {
137*61046927SAndroid Build Coastguard Worker    const struct pvr_device_ident *const ident = &dev_info->ident;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    return PVR_BVNC_PACK(ident->b, ident->v, ident->n, ident->c);
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker 
pvr_has_hard_coded_shaders(const struct pvr_device_info * const dev_info)142*61046927SAndroid Build Coastguard Worker bool pvr_has_hard_coded_shaders(const struct pvr_device_info *const dev_info)
143*61046927SAndroid Build Coastguard Worker {
144*61046927SAndroid Build Coastguard Worker    const char *const program = util_get_process_name();
145*61046927SAndroid Build Coastguard Worker    const uint64_t bvnc = pvr_device_get_bvnc(dev_info);
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < ARRAY_SIZE(hard_coding_table); i++) {
148*61046927SAndroid Build Coastguard Worker       if (bvnc != hard_coding_table[i].bvnc)
149*61046927SAndroid Build Coastguard Worker          continue;
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker       if (strcmp(program, hard_coding_table[i].name) == 0)
152*61046927SAndroid Build Coastguard Worker          return true;
153*61046927SAndroid Build Coastguard Worker    }
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker    return false;
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker static const struct pvr_hard_coding_data *
pvr_get_hard_coding_data(const struct pvr_device_info * const dev_info)159*61046927SAndroid Build Coastguard Worker pvr_get_hard_coding_data(const struct pvr_device_info *const dev_info)
160*61046927SAndroid Build Coastguard Worker {
161*61046927SAndroid Build Coastguard Worker    const char *const program = util_get_process_name();
162*61046927SAndroid Build Coastguard Worker    const uint64_t bvnc = pvr_device_get_bvnc(dev_info);
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < ARRAY_SIZE(hard_coding_table); i++) {
165*61046927SAndroid Build Coastguard Worker       if (bvnc != hard_coding_table[i].bvnc)
166*61046927SAndroid Build Coastguard Worker          continue;
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker       if (strcmp(program, hard_coding_table[i].name) == 0)
169*61046927SAndroid Build Coastguard Worker          return &hard_coding_table[i];
170*61046927SAndroid Build Coastguard Worker    }
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    mesa_loge("Could not find hard coding data for %s", program);
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker    return NULL;
175*61046927SAndroid Build Coastguard Worker }
176*61046927SAndroid Build Coastguard Worker 
pvr_hard_code_compute_pipeline(struct pvr_device * const device,struct pvr_compute_shader_state * const shader_state_out,struct pvr_hard_code_compute_build_info * const build_info_out)177*61046927SAndroid Build Coastguard Worker VkResult pvr_hard_code_compute_pipeline(
178*61046927SAndroid Build Coastguard Worker    struct pvr_device *const device,
179*61046927SAndroid Build Coastguard Worker    struct pvr_compute_shader_state *const shader_state_out,
180*61046927SAndroid Build Coastguard Worker    struct pvr_hard_code_compute_build_info *const build_info_out)
181*61046927SAndroid Build Coastguard Worker {
182*61046927SAndroid Build Coastguard Worker    const uint32_t cache_line_size =
183*61046927SAndroid Build Coastguard Worker       rogue_get_slc_cache_line_size(&device->pdevice->dev_info);
184*61046927SAndroid Build Coastguard Worker    const struct pvr_hard_coding_data *const data =
185*61046927SAndroid Build Coastguard Worker       pvr_get_hard_coding_data(&device->pdevice->dev_info);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker    assert(data->type == PVR_HARD_CODE_SHADER_TYPE_COMPUTE);
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker    mesa_logd("Hard coding compute pipeline for %s", data->name);
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    *build_info_out = data->compute.build_info;
192*61046927SAndroid Build Coastguard Worker    *shader_state_out = data->compute.shader_info;
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker    return pvr_gpu_upload_usc(device,
195*61046927SAndroid Build Coastguard Worker                              data->compute.shader,
196*61046927SAndroid Build Coastguard Worker                              data->compute.shader_size,
197*61046927SAndroid Build Coastguard Worker                              cache_line_size,
198*61046927SAndroid Build Coastguard Worker                              &shader_state_out->bo);
199*61046927SAndroid Build Coastguard Worker }
200*61046927SAndroid Build Coastguard Worker 
201*61046927SAndroid Build Coastguard Worker uint32_t
pvr_hard_code_graphics_get_flags(const struct pvr_device_info * const dev_info)202*61046927SAndroid Build Coastguard Worker pvr_hard_code_graphics_get_flags(const struct pvr_device_info *const dev_info)
203*61046927SAndroid Build Coastguard Worker {
204*61046927SAndroid Build Coastguard Worker    const struct pvr_hard_coding_data *const data =
205*61046927SAndroid Build Coastguard Worker       pvr_get_hard_coding_data(dev_info);
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    assert(data->type == PVR_HARD_CODE_SHADER_TYPE_GRAPHICS);
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker    return data->graphics.flags;
210*61046927SAndroid Build Coastguard Worker }
211*61046927SAndroid Build Coastguard Worker 
pvr_hard_code_graphics_shader(const struct pvr_device_info * const dev_info,uint32_t pipeline_n,gl_shader_stage stage,struct util_dynarray * shader_out)212*61046927SAndroid Build Coastguard Worker void pvr_hard_code_graphics_shader(const struct pvr_device_info *const dev_info,
213*61046927SAndroid Build Coastguard Worker                                    uint32_t pipeline_n,
214*61046927SAndroid Build Coastguard Worker                                    gl_shader_stage stage,
215*61046927SAndroid Build Coastguard Worker                                    struct util_dynarray *shader_out)
216*61046927SAndroid Build Coastguard Worker {
217*61046927SAndroid Build Coastguard Worker    const struct pvr_hard_coding_data *const data =
218*61046927SAndroid Build Coastguard Worker       pvr_get_hard_coding_data(dev_info);
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker    assert(data->type == PVR_HARD_CODE_SHADER_TYPE_GRAPHICS);
221*61046927SAndroid Build Coastguard Worker    assert(pipeline_n < data->graphics.shader_count);
222*61046927SAndroid Build Coastguard Worker    assert(data->graphics.flags & BITFIELD_BIT(stage));
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker    mesa_logd("Hard coding %s stage shader for \"%s\" demo.",
225*61046927SAndroid Build Coastguard Worker              _mesa_shader_stage_to_string(stage),
226*61046927SAndroid Build Coastguard Worker              data->name);
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    switch (stage) {
229*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
230*61046927SAndroid Build Coastguard Worker       util_dynarray_append_mem(shader_out,
231*61046927SAndroid Build Coastguard Worker                                data->graphics.vert_shader_sizes[pipeline_n],
232*61046927SAndroid Build Coastguard Worker                                data->graphics.vert_shaders[pipeline_n]);
233*61046927SAndroid Build Coastguard Worker       break;
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
236*61046927SAndroid Build Coastguard Worker       util_dynarray_append_mem(shader_out,
237*61046927SAndroid Build Coastguard Worker                                data->graphics.frag_shader_sizes[pipeline_n],
238*61046927SAndroid Build Coastguard Worker                                data->graphics.frag_shaders[pipeline_n]);
239*61046927SAndroid Build Coastguard Worker       break;
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker    default:
242*61046927SAndroid Build Coastguard Worker       unreachable("Unsupported stage.");
243*61046927SAndroid Build Coastguard Worker    }
244*61046927SAndroid Build Coastguard Worker }
245*61046927SAndroid Build Coastguard Worker 
pvr_hard_code_graphics_vertex_state(const struct pvr_device_info * const dev_info,uint32_t pipeline_n,struct pvr_vertex_shader_state * const vert_state_out)246*61046927SAndroid Build Coastguard Worker void pvr_hard_code_graphics_vertex_state(
247*61046927SAndroid Build Coastguard Worker    const struct pvr_device_info *const dev_info,
248*61046927SAndroid Build Coastguard Worker    uint32_t pipeline_n,
249*61046927SAndroid Build Coastguard Worker    struct pvr_vertex_shader_state *const vert_state_out)
250*61046927SAndroid Build Coastguard Worker {
251*61046927SAndroid Build Coastguard Worker    const struct pvr_hard_coding_data *const data =
252*61046927SAndroid Build Coastguard Worker       pvr_get_hard_coding_data(dev_info);
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    assert(data->type == PVR_HARD_CODE_SHADER_TYPE_GRAPHICS);
255*61046927SAndroid Build Coastguard Worker    assert(pipeline_n < data->graphics.shader_count);
256*61046927SAndroid Build Coastguard Worker    assert(data->graphics.flags & BITFIELD_BIT(MESA_SHADER_VERTEX));
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker    *vert_state_out = *data->graphics.vert_shader_states[0];
259*61046927SAndroid Build Coastguard Worker }
260*61046927SAndroid Build Coastguard Worker 
pvr_hard_code_graphics_fragment_state(const struct pvr_device_info * const dev_info,uint32_t pipeline_n,struct pvr_fragment_shader_state * const frag_state_out)261*61046927SAndroid Build Coastguard Worker void pvr_hard_code_graphics_fragment_state(
262*61046927SAndroid Build Coastguard Worker    const struct pvr_device_info *const dev_info,
263*61046927SAndroid Build Coastguard Worker    uint32_t pipeline_n,
264*61046927SAndroid Build Coastguard Worker    struct pvr_fragment_shader_state *const frag_state_out)
265*61046927SAndroid Build Coastguard Worker {
266*61046927SAndroid Build Coastguard Worker    const struct pvr_hard_coding_data *const data =
267*61046927SAndroid Build Coastguard Worker       pvr_get_hard_coding_data(dev_info);
268*61046927SAndroid Build Coastguard Worker 
269*61046927SAndroid Build Coastguard Worker    assert(data->type == PVR_HARD_CODE_SHADER_TYPE_GRAPHICS);
270*61046927SAndroid Build Coastguard Worker    assert(pipeline_n < data->graphics.shader_count);
271*61046927SAndroid Build Coastguard Worker    assert(data->graphics.flags & BITFIELD_BIT(MESA_SHADER_FRAGMENT));
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker    *frag_state_out = *data->graphics.frag_shader_states[0];
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker 
pvr_hard_code_graphics_get_build_info(const struct pvr_device_info * const dev_info,uint32_t pipeline_n,gl_shader_stage stage,struct rogue_common_build_data * const common_build_data,struct rogue_build_data * const build_data,struct pvr_explicit_constant_usage * const explicit_const_usage)276*61046927SAndroid Build Coastguard Worker void pvr_hard_code_graphics_get_build_info(
277*61046927SAndroid Build Coastguard Worker    const struct pvr_device_info *const dev_info,
278*61046927SAndroid Build Coastguard Worker    uint32_t pipeline_n,
279*61046927SAndroid Build Coastguard Worker    gl_shader_stage stage,
280*61046927SAndroid Build Coastguard Worker    struct rogue_common_build_data *const common_build_data,
281*61046927SAndroid Build Coastguard Worker    struct rogue_build_data *const build_data,
282*61046927SAndroid Build Coastguard Worker    struct pvr_explicit_constant_usage *const explicit_const_usage)
283*61046927SAndroid Build Coastguard Worker {
284*61046927SAndroid Build Coastguard Worker    const struct pvr_hard_coding_data *const data =
285*61046927SAndroid Build Coastguard Worker       pvr_get_hard_coding_data(dev_info);
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker    assert(data->type == PVR_HARD_CODE_SHADER_TYPE_GRAPHICS);
288*61046927SAndroid Build Coastguard Worker    assert(pipeline_n < data->graphics.shader_count);
289*61046927SAndroid Build Coastguard Worker    assert(data->graphics.flags & BITFIELD_BIT(stage));
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    switch (stage) {
292*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
293*61046927SAndroid Build Coastguard Worker       assert(data->graphics.build_infos[pipeline_n]->vert_common_data.temps ==
294*61046927SAndroid Build Coastguard Worker              data->graphics.vert_shader_states[pipeline_n]
295*61046927SAndroid Build Coastguard Worker                 ->stage_state.pds_temps_count);
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker       assert(data->graphics.build_infos[pipeline_n]->vert_common_data.coeffs ==
298*61046927SAndroid Build Coastguard Worker              data->graphics.vert_shader_states[pipeline_n]
299*61046927SAndroid Build Coastguard Worker                 ->stage_state.coefficient_size);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker       build_data->vs = data->graphics.build_infos[pipeline_n]->stage_data.vs;
302*61046927SAndroid Build Coastguard Worker       *common_build_data =
303*61046927SAndroid Build Coastguard Worker          data->graphics.build_infos[pipeline_n]->vert_common_data;
304*61046927SAndroid Build Coastguard Worker       *explicit_const_usage =
305*61046927SAndroid Build Coastguard Worker          data->graphics.build_infos[pipeline_n]->vert_explicit_conts_usage;
306*61046927SAndroid Build Coastguard Worker 
307*61046927SAndroid Build Coastguard Worker       break;
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
310*61046927SAndroid Build Coastguard Worker       assert(data->graphics.build_infos[pipeline_n]->frag_common_data.temps ==
311*61046927SAndroid Build Coastguard Worker              data->graphics.frag_shader_states[pipeline_n]
312*61046927SAndroid Build Coastguard Worker                 ->stage_state.pds_temps_count);
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker       assert(data->graphics.build_infos[pipeline_n]->frag_common_data.coeffs ==
315*61046927SAndroid Build Coastguard Worker              data->graphics.frag_shader_states[pipeline_n]
316*61046927SAndroid Build Coastguard Worker                 ->stage_state.coefficient_size);
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker       build_data->fs = data->graphics.build_infos[pipeline_n]->stage_data.fs;
319*61046927SAndroid Build Coastguard Worker       *common_build_data =
320*61046927SAndroid Build Coastguard Worker          data->graphics.build_infos[pipeline_n]->frag_common_data;
321*61046927SAndroid Build Coastguard Worker       *explicit_const_usage =
322*61046927SAndroid Build Coastguard Worker          data->graphics.build_infos[pipeline_n]->frag_explicit_conts_usage;
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker       break;
325*61046927SAndroid Build Coastguard Worker 
326*61046927SAndroid Build Coastguard Worker    default:
327*61046927SAndroid Build Coastguard Worker       unreachable("Unsupported stage.");
328*61046927SAndroid Build Coastguard Worker    }
329*61046927SAndroid Build Coastguard Worker }
330*61046927SAndroid Build Coastguard Worker 
pvr_hard_code_get_idfwdf_program(const struct pvr_device_info * const dev_info,struct util_dynarray * program_out,uint32_t * usc_shareds_out,uint32_t * usc_temps_out)331*61046927SAndroid Build Coastguard Worker void pvr_hard_code_get_idfwdf_program(
332*61046927SAndroid Build Coastguard Worker    const struct pvr_device_info *const dev_info,
333*61046927SAndroid Build Coastguard Worker    struct util_dynarray *program_out,
334*61046927SAndroid Build Coastguard Worker    uint32_t *usc_shareds_out,
335*61046927SAndroid Build Coastguard Worker    uint32_t *usc_temps_out)
336*61046927SAndroid Build Coastguard Worker {
337*61046927SAndroid Build Coastguard Worker    static const uint8_t shader[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker    mesa_loge("No hard coded idfwdf program. Returning empty program.");
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker    util_dynarray_append_mem(program_out, ARRAY_SIZE(shader), &shader[0]);
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker    *usc_shareds_out = 12U;
344*61046927SAndroid Build Coastguard Worker    *usc_temps_out = 4U;
345*61046927SAndroid Build Coastguard Worker }
346*61046927SAndroid Build Coastguard Worker 
pvr_hard_code_get_passthrough_vertex_shader(const struct pvr_device_info * const dev_info,struct util_dynarray * program_out)347*61046927SAndroid Build Coastguard Worker void pvr_hard_code_get_passthrough_vertex_shader(
348*61046927SAndroid Build Coastguard Worker    const struct pvr_device_info *const dev_info,
349*61046927SAndroid Build Coastguard Worker    struct util_dynarray *program_out)
350*61046927SAndroid Build Coastguard Worker {
351*61046927SAndroid Build Coastguard Worker    static const uint8_t shader[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker    mesa_loge(
354*61046927SAndroid Build Coastguard Worker       "No hard coded passthrough vertex shader. Returning empty shader.");
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker    util_dynarray_append_mem(program_out, ARRAY_SIZE(shader), &shader[0]);
357*61046927SAndroid Build Coastguard Worker };
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker /* Render target array (RTA). */
pvr_hard_code_get_passthrough_rta_vertex_shader(const struct pvr_device_info * const dev_info,struct util_dynarray * program_out)360*61046927SAndroid Build Coastguard Worker void pvr_hard_code_get_passthrough_rta_vertex_shader(
361*61046927SAndroid Build Coastguard Worker    const struct pvr_device_info *const dev_info,
362*61046927SAndroid Build Coastguard Worker    struct util_dynarray *program_out)
363*61046927SAndroid Build Coastguard Worker {
364*61046927SAndroid Build Coastguard Worker    uint32_t shader[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker    util_dynarray_append_mem(program_out, ARRAY_SIZE(shader), &shader);
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker    mesa_loge("No hard coded passthrough rta vertex shader. Returning "
369*61046927SAndroid Build Coastguard Worker              "empty shader.");
370*61046927SAndroid Build Coastguard Worker }
371