1*61046927SAndroid Build Coastguard Worker/* 2*61046927SAndroid Build Coastguard Worker * Copyright 2024 Valve Corporation 3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*61046927SAndroid Build Coastguard Worker */ 5*61046927SAndroid Build Coastguard Worker#include "libagx.h" 6*61046927SAndroid Build Coastguard Worker#include "draws.h" 7*61046927SAndroid Build Coastguard Worker 8*61046927SAndroid Build Coastguard Worker/* 9*61046927SAndroid Build Coastguard Worker * To implement drawIndirectCount generically, we dispatch a kernel to 10*61046927SAndroid Build Coastguard Worker * clone-and-patch the indirect buffer, predicating out draws as appropriate. 11*61046927SAndroid Build Coastguard Worker */ 12*61046927SAndroid Build Coastguard Workervoid 13*61046927SAndroid Build Coastguard Workerlibagx_predicate_indirect(constant struct libagx_predicate_indirect_push *push, 14*61046927SAndroid Build Coastguard Worker uint draw, bool indexed) 15*61046927SAndroid Build Coastguard Worker{ 16*61046927SAndroid Build Coastguard Worker uint words = indexed ? 5 : 4; 17*61046927SAndroid Build Coastguard Worker global uint *out = &push->out[draw * words]; 18*61046927SAndroid Build Coastguard Worker constant uint *in = &push->in[draw * push->stride_el]; 19*61046927SAndroid Build Coastguard Worker bool enabled = draw < *(push->draw_count); 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Worker /* Copy enabled draws, zero predicated draws. */ 22*61046927SAndroid Build Coastguard Worker for (uint i = 0; i < words; ++i) { 23*61046927SAndroid Build Coastguard Worker out[i] = enabled ? in[i] : 0; 24*61046927SAndroid Build Coastguard Worker } 25*61046927SAndroid Build Coastguard Worker} 26