17ec681f3Smrg/*
27ec681f3Smrg * Copyright © 2021 Raspberry Pi
37ec681f3Smrg *
47ec681f3Smrg * Permission is hereby granted, free of charge, to any person obtaining a
57ec681f3Smrg * copy of this software and associated documentation files (the "Software"),
67ec681f3Smrg * to deal in the Software without restriction, including without limitation
77ec681f3Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
87ec681f3Smrg * and/or sell copies of the Software, and to permit persons to whom the
97ec681f3Smrg * Software is furnished to do so, subject to the following conditions:
107ec681f3Smrg *
117ec681f3Smrg * The above copyright notice and this permission notice (including the next
127ec681f3Smrg * paragraph) shall be included in all copies or substantial portions of the
137ec681f3Smrg * Software.
147ec681f3Smrg *
157ec681f3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
167ec681f3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
177ec681f3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
187ec681f3Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
197ec681f3Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
207ec681f3Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
217ec681f3Smrg * IN THE SOFTWARE.
227ec681f3Smrg */
237ec681f3Smrg
247ec681f3Smrg#include "v3dv_private.h"
257ec681f3Smrg#include "broadcom/common/v3d_macros.h"
267ec681f3Smrg#include "broadcom/cle/v3dx_pack.h"
277ec681f3Smrg#include "broadcom/compiler/v3d_compiler.h"
287ec681f3Smrg
297ec681f3Smrgvoid
307ec681f3Smrgv3dX(job_emit_noop)(struct v3dv_job *job)
317ec681f3Smrg{
327ec681f3Smrg   v3dv_job_start_frame(job, 1, 1, 1, true, 1, V3D_INTERNAL_BPP_32, false);
337ec681f3Smrg   v3dX(job_emit_binning_flush)(job);
347ec681f3Smrg
357ec681f3Smrg   struct v3dv_cl *rcl = &job->rcl;
367ec681f3Smrg   v3dv_cl_ensure_space_with_branch(rcl, 200 + 1 * 256 *
377ec681f3Smrg                                    cl_packet_length(SUPERTILE_COORDINATES));
387ec681f3Smrg
397ec681f3Smrg   cl_emit(rcl, TILE_RENDERING_MODE_CFG_COMMON, config) {
407ec681f3Smrg      config.early_z_disable = true;
417ec681f3Smrg      config.image_width_pixels = 1;
427ec681f3Smrg      config.image_height_pixels = 1;
437ec681f3Smrg      config.number_of_render_targets = 1;
447ec681f3Smrg      config.multisample_mode_4x = false;
457ec681f3Smrg      config.maximum_bpp_of_all_render_targets = V3D_INTERNAL_BPP_32;
467ec681f3Smrg   }
477ec681f3Smrg
487ec681f3Smrg   cl_emit(rcl, TILE_RENDERING_MODE_CFG_COLOR, rt) {
497ec681f3Smrg      rt.render_target_0_internal_bpp = V3D_INTERNAL_BPP_32;
507ec681f3Smrg      rt.render_target_0_internal_type = V3D_INTERNAL_TYPE_8;
517ec681f3Smrg      rt.render_target_0_clamp = V3D_RENDER_TARGET_CLAMP_NONE;
527ec681f3Smrg   }
537ec681f3Smrg
547ec681f3Smrg   cl_emit(rcl, TILE_RENDERING_MODE_CFG_ZS_CLEAR_VALUES, clear) {
557ec681f3Smrg      clear.z_clear_value = 1.0f;
567ec681f3Smrg      clear.stencil_clear_value = 0;
577ec681f3Smrg   };
587ec681f3Smrg
597ec681f3Smrg   cl_emit(rcl, TILE_LIST_INITIAL_BLOCK_SIZE, init) {
607ec681f3Smrg      init.use_auto_chained_tile_lists = true;
617ec681f3Smrg      init.size_of_first_block_in_chained_tile_lists =
627ec681f3Smrg         TILE_ALLOCATION_BLOCK_SIZE_64B;
637ec681f3Smrg   }
647ec681f3Smrg
657ec681f3Smrg   cl_emit(rcl, MULTICORE_RENDERING_TILE_LIST_SET_BASE, list) {
667ec681f3Smrg      list.address = v3dv_cl_address(job->tile_alloc, 0);
677ec681f3Smrg   }
687ec681f3Smrg
697ec681f3Smrg   cl_emit(rcl, MULTICORE_RENDERING_SUPERTILE_CFG, config) {
707ec681f3Smrg      config.number_of_bin_tile_lists = 1;
717ec681f3Smrg      config.total_frame_width_in_tiles = 1;
727ec681f3Smrg      config.total_frame_height_in_tiles = 1;
737ec681f3Smrg      config.supertile_width_in_tiles = 1;
747ec681f3Smrg      config.supertile_height_in_tiles = 1;
757ec681f3Smrg      config.total_frame_width_in_supertiles = 1;
767ec681f3Smrg      config.total_frame_height_in_supertiles = 1;
777ec681f3Smrg   }
787ec681f3Smrg
797ec681f3Smrg   struct v3dv_cl *icl = &job->indirect;
807ec681f3Smrg   v3dv_cl_ensure_space(icl, 200, 1);
817ec681f3Smrg   struct v3dv_cl_reloc tile_list_start = v3dv_cl_get_address(icl);
827ec681f3Smrg
837ec681f3Smrg   cl_emit(icl, TILE_COORDINATES_IMPLICIT, coords);
847ec681f3Smrg
857ec681f3Smrg   cl_emit(icl, END_OF_LOADS, end);
867ec681f3Smrg
877ec681f3Smrg   cl_emit(icl, BRANCH_TO_IMPLICIT_TILE_LIST, branch);
887ec681f3Smrg
897ec681f3Smrg   cl_emit(icl, STORE_TILE_BUFFER_GENERAL, store) {
907ec681f3Smrg      store.buffer_to_store = NONE;
917ec681f3Smrg   }
927ec681f3Smrg
937ec681f3Smrg   cl_emit(icl, END_OF_TILE_MARKER, end);
947ec681f3Smrg
957ec681f3Smrg   cl_emit(icl, RETURN_FROM_SUB_LIST, ret);
967ec681f3Smrg
977ec681f3Smrg   cl_emit(rcl, START_ADDRESS_OF_GENERIC_TILE_LIST, branch) {
987ec681f3Smrg      branch.start = tile_list_start;
997ec681f3Smrg      branch.end = v3dv_cl_get_address(icl);
1007ec681f3Smrg   }
1017ec681f3Smrg
1027ec681f3Smrg   cl_emit(rcl, SUPERTILE_COORDINATES, coords) {
1037ec681f3Smrg      coords.column_number_in_supertiles = 0;
1047ec681f3Smrg      coords.row_number_in_supertiles = 0;
1057ec681f3Smrg   }
1067ec681f3Smrg
1077ec681f3Smrg   cl_emit(rcl, END_OF_RENDERING, end);
1087ec681f3Smrg}
109