xref: /aosp_15_r20/external/mesa3d/src/asahi/lib/shaders/draws.cl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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