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