1*61046927SAndroid Build Coastguard Worker/* Copyright © 2023 Intel Corporation 2*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 3*61046927SAndroid Build Coastguard Worker */ 4*61046927SAndroid Build Coastguard Worker 5*61046927SAndroid Build Coastguard Worker#include "libintel_shaders.h" 6*61046927SAndroid Build Coastguard Worker 7*61046927SAndroid Build Coastguard Workerstatic void end_generated_draws(global void *dst_ptr, 8*61046927SAndroid Build Coastguard Worker uint32_t item_idx, 9*61046927SAndroid Build Coastguard Worker uint32_t draw_id, uint32_t draw_count, 10*61046927SAndroid Build Coastguard Worker uint32_t ring_count, uint32_t max_draw_count, 11*61046927SAndroid Build Coastguard Worker uint32_t flags, 12*61046927SAndroid Build Coastguard Worker uint64_t gen_addr, uint64_t end_addr) 13*61046927SAndroid Build Coastguard Worker{ 14*61046927SAndroid Build Coastguard Worker uint32_t _3dprim_size_B = ((flags >> 16) & 0xff) * 4; 15*61046927SAndroid Build Coastguard Worker bool indirect_count = (flags & ANV_GENERATED_FLAG_COUNT) != 0; 16*61046927SAndroid Build Coastguard Worker bool ring_mode = (flags & ANV_GENERATED_FLAG_RING_MODE) != 0; 17*61046927SAndroid Build Coastguard Worker /* We can have an indirect draw count = 0. */ 18*61046927SAndroid Build Coastguard Worker uint32_t last_draw_id = draw_count == 0 ? 0 : (min(draw_count, max_draw_count) - 1); 19*61046927SAndroid Build Coastguard Worker global void *jump_dst = draw_count == 0 ? dst_ptr : (dst_ptr + _3dprim_size_B); 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Worker if (ring_mode) { 22*61046927SAndroid Build Coastguard Worker if (draw_id == last_draw_id) { 23*61046927SAndroid Build Coastguard Worker /* Exit the ring buffer to the next user commands */ 24*61046927SAndroid Build Coastguard Worker genX(write_MI_BATCH_BUFFER_START)(jump_dst, end_addr); 25*61046927SAndroid Build Coastguard Worker } else if (item_idx == (ring_count - 1)) { 26*61046927SAndroid Build Coastguard Worker /* Jump back to the generation shader to generate mode draws */ 27*61046927SAndroid Build Coastguard Worker genX(write_MI_BATCH_BUFFER_START)(jump_dst, gen_addr); 28*61046927SAndroid Build Coastguard Worker } 29*61046927SAndroid Build Coastguard Worker } else { 30*61046927SAndroid Build Coastguard Worker if (draw_id == last_draw_id && draw_count < max_draw_count) { 31*61046927SAndroid Build Coastguard Worker /* Skip forward to the end of the generated draws */ 32*61046927SAndroid Build Coastguard Worker genX(write_MI_BATCH_BUFFER_START)(jump_dst, end_addr); 33*61046927SAndroid Build Coastguard Worker } 34*61046927SAndroid Build Coastguard Worker } 35*61046927SAndroid Build Coastguard Worker} 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Workervoid 38*61046927SAndroid Build Coastguard WorkergenX(libanv_write_draw)(global void *dst_base, 39*61046927SAndroid Build Coastguard Worker global void *indirect_base, 40*61046927SAndroid Build Coastguard Worker global void *draw_id_base, 41*61046927SAndroid Build Coastguard Worker uint32_t indirect_stride, 42*61046927SAndroid Build Coastguard Worker global uint32_t *_draw_count, 43*61046927SAndroid Build Coastguard Worker uint32_t draw_base, 44*61046927SAndroid Build Coastguard Worker uint32_t instance_multiplier, 45*61046927SAndroid Build Coastguard Worker uint32_t max_draw_count, 46*61046927SAndroid Build Coastguard Worker uint32_t flags, 47*61046927SAndroid Build Coastguard Worker uint32_t ring_count, 48*61046927SAndroid Build Coastguard Worker uint64_t gen_addr, 49*61046927SAndroid Build Coastguard Worker uint64_t end_addr, 50*61046927SAndroid Build Coastguard Worker uint32_t item_idx) 51*61046927SAndroid Build Coastguard Worker{ 52*61046927SAndroid Build Coastguard Worker uint32_t _3dprim_size_B = ((flags >> 16) & 0xff) * 4; 53*61046927SAndroid Build Coastguard Worker uint32_t draw_id = draw_base + item_idx; 54*61046927SAndroid Build Coastguard Worker uint32_t draw_count = *_draw_count; 55*61046927SAndroid Build Coastguard Worker global void *dst_ptr = dst_base + item_idx * _3dprim_size_B; 56*61046927SAndroid Build Coastguard Worker global void *indirect_ptr = indirect_base + draw_id * indirect_stride; 57*61046927SAndroid Build Coastguard Worker global void *draw_id_ptr = draw_id_base + item_idx * 4; 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Worker if (draw_id < min(draw_count, max_draw_count)) { 60*61046927SAndroid Build Coastguard Worker bool is_indexed = (flags & ANV_GENERATED_FLAG_INDEXED) != 0; 61*61046927SAndroid Build Coastguard Worker bool is_predicated = (flags & ANV_GENERATED_FLAG_PREDICATED) != 0; 62*61046927SAndroid Build Coastguard Worker bool uses_tbimr = (flags & ANV_GENERATED_FLAG_TBIMR) != 0; 63*61046927SAndroid Build Coastguard Worker bool uses_base = (flags & ANV_GENERATED_FLAG_BASE) != 0; 64*61046927SAndroid Build Coastguard Worker bool uses_drawid = (flags & ANV_GENERATED_FLAG_DRAWID) != 0; 65*61046927SAndroid Build Coastguard Worker uint32_t mocs = (flags >> 8) & 0xff; 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Worker genX(write_draw)(dst_ptr, indirect_ptr, draw_id_ptr, 68*61046927SAndroid Build Coastguard Worker draw_id, instance_multiplier, 69*61046927SAndroid Build Coastguard Worker is_indexed, is_predicated, 70*61046927SAndroid Build Coastguard Worker uses_tbimr, uses_base, uses_drawid, 71*61046927SAndroid Build Coastguard Worker mocs); 72*61046927SAndroid Build Coastguard Worker } 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker end_generated_draws(dst_ptr, item_idx, draw_id, draw_count, 75*61046927SAndroid Build Coastguard Worker ring_count, max_draw_count, flags, 76*61046927SAndroid Build Coastguard Worker gen_addr, end_addr); 77*61046927SAndroid Build Coastguard Worker} 78