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 Workervoid genX(write_3DSTATE_VERTEX_BUFFERS)(global void *dst_ptr, 8*61046927SAndroid Build Coastguard Worker uint32_t buffer_count) 9*61046927SAndroid Build Coastguard Worker{ 10*61046927SAndroid Build Coastguard Worker struct GENX(3DSTATE_VERTEX_BUFFERS) v = { 11*61046927SAndroid Build Coastguard Worker GENX(3DSTATE_VERTEX_BUFFERS_header), 12*61046927SAndroid Build Coastguard Worker }; 13*61046927SAndroid Build Coastguard Worker v.DWordLength = 1 + (buffer_count * 4) - 14*61046927SAndroid Build Coastguard Worker GENX(3DSTATE_VERTEX_BUFFERS_length_bias); 15*61046927SAndroid Build Coastguard Worker GENX(3DSTATE_VERTEX_BUFFERS_pack)(dst_ptr, &v); 16*61046927SAndroid Build Coastguard Worker} 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Workervoid genX(write_VERTEX_BUFFER_STATE)(global void *dst_ptr, 19*61046927SAndroid Build Coastguard Worker uint32_t mocs, 20*61046927SAndroid Build Coastguard Worker uint32_t buffer_idx, 21*61046927SAndroid Build Coastguard Worker uint64_t address, 22*61046927SAndroid Build Coastguard Worker uint32_t size, 23*61046927SAndroid Build Coastguard Worker uint32_t stride) 24*61046927SAndroid Build Coastguard Worker{ 25*61046927SAndroid Build Coastguard Worker bool buffer_null = address == 0; 26*61046927SAndroid Build Coastguard Worker struct GENX(VERTEX_BUFFER_STATE) v = { 27*61046927SAndroid Build Coastguard Worker .BufferPitch = stride, 28*61046927SAndroid Build Coastguard Worker .NullVertexBuffer = address == 0, 29*61046927SAndroid Build Coastguard Worker .AddressModifyEnable = true, 30*61046927SAndroid Build Coastguard Worker .MOCS = mocs, 31*61046927SAndroid Build Coastguard Worker#if GFX_VER >= 12 32*61046927SAndroid Build Coastguard Worker .L3BypassDisable = true, 33*61046927SAndroid Build Coastguard Worker#endif 34*61046927SAndroid Build Coastguard Worker .VertexBufferIndex = buffer_idx, 35*61046927SAndroid Build Coastguard Worker .BufferStartingAddress = address, 36*61046927SAndroid Build Coastguard Worker .BufferSize = size, 37*61046927SAndroid Build Coastguard Worker }; 38*61046927SAndroid Build Coastguard Worker GENX(VERTEX_BUFFER_STATE_pack)(dst_ptr, &v); 39*61046927SAndroid Build Coastguard Worker} 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Workervoid genX(write_3DPRIMITIVE)(global void *dst_ptr, 42*61046927SAndroid Build Coastguard Worker bool is_predicated, 43*61046927SAndroid Build Coastguard Worker bool is_indexed, 44*61046927SAndroid Build Coastguard Worker bool uses_tbimr, 45*61046927SAndroid Build Coastguard Worker uint32_t vertex_count_per_instance, 46*61046927SAndroid Build Coastguard Worker uint32_t start_vertex_location, 47*61046927SAndroid Build Coastguard Worker uint32_t instance_count, 48*61046927SAndroid Build Coastguard Worker uint32_t start_instance_location, 49*61046927SAndroid Build Coastguard Worker uint32_t base_vertex_location) 50*61046927SAndroid Build Coastguard Worker{ 51*61046927SAndroid Build Coastguard Worker struct GENX(3DPRIMITIVE) v = { 52*61046927SAndroid Build Coastguard Worker GENX(3DPRIMITIVE_header), 53*61046927SAndroid Build Coastguard Worker#if GFX_VERx10 >= 125 54*61046927SAndroid Build Coastguard Worker .TBIMREnable = uses_tbimr, 55*61046927SAndroid Build Coastguard Worker#endif 56*61046927SAndroid Build Coastguard Worker .PredicateEnable = is_predicated, 57*61046927SAndroid Build Coastguard Worker .VertexAccessType = is_indexed ? RANDOM : SEQUENTIAL, 58*61046927SAndroid Build Coastguard Worker .VertexCountPerInstance = vertex_count_per_instance, 59*61046927SAndroid Build Coastguard Worker .StartVertexLocation = start_vertex_location, 60*61046927SAndroid Build Coastguard Worker .InstanceCount = instance_count, 61*61046927SAndroid Build Coastguard Worker .StartInstanceLocation = start_instance_location, 62*61046927SAndroid Build Coastguard Worker .BaseVertexLocation = base_vertex_location, 63*61046927SAndroid Build Coastguard Worker }; 64*61046927SAndroid Build Coastguard Worker GENX(3DPRIMITIVE_pack)(dst_ptr, &v); 65*61046927SAndroid Build Coastguard Worker} 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Worker#if GFX_VER >= 11 68*61046927SAndroid Build Coastguard Workervoid genX(write_3DPRIMITIVE_EXTENDED)(global void *dst_ptr, 69*61046927SAndroid Build Coastguard Worker bool is_predicated, 70*61046927SAndroid Build Coastguard Worker bool is_indexed, 71*61046927SAndroid Build Coastguard Worker bool uses_tbimr, 72*61046927SAndroid Build Coastguard Worker uint32_t vertex_count_per_instance, 73*61046927SAndroid Build Coastguard Worker uint32_t start_vertex_location, 74*61046927SAndroid Build Coastguard Worker uint32_t instance_count, 75*61046927SAndroid Build Coastguard Worker uint32_t start_instance_location, 76*61046927SAndroid Build Coastguard Worker uint32_t base_vertex_location, 77*61046927SAndroid Build Coastguard Worker uint32_t param_base_vertex, 78*61046927SAndroid Build Coastguard Worker uint32_t param_base_instance, 79*61046927SAndroid Build Coastguard Worker uint32_t param_draw_id) 80*61046927SAndroid Build Coastguard Worker{ 81*61046927SAndroid Build Coastguard Worker struct GENX(3DPRIMITIVE_EXTENDED) v = { 82*61046927SAndroid Build Coastguard Worker GENX(3DPRIMITIVE_EXTENDED_header), 83*61046927SAndroid Build Coastguard Worker#if GFX_VERx10 >= 125 84*61046927SAndroid Build Coastguard Worker .TBIMREnable = uses_tbimr, 85*61046927SAndroid Build Coastguard Worker#endif 86*61046927SAndroid Build Coastguard Worker .PredicateEnable = is_predicated, 87*61046927SAndroid Build Coastguard Worker .VertexAccessType = is_indexed ? RANDOM : SEQUENTIAL, 88*61046927SAndroid Build Coastguard Worker .VertexCountPerInstance = vertex_count_per_instance, 89*61046927SAndroid Build Coastguard Worker .StartVertexLocation = start_vertex_location, 90*61046927SAndroid Build Coastguard Worker .InstanceCount = instance_count, 91*61046927SAndroid Build Coastguard Worker .StartInstanceLocation = start_instance_location, 92*61046927SAndroid Build Coastguard Worker .BaseVertexLocation = base_vertex_location, 93*61046927SAndroid Build Coastguard Worker .ExtendedParameter0 = param_base_vertex, 94*61046927SAndroid Build Coastguard Worker .ExtendedParameter1 = param_base_instance, 95*61046927SAndroid Build Coastguard Worker .ExtendedParameter2 = param_draw_id, 96*61046927SAndroid Build Coastguard Worker }; 97*61046927SAndroid Build Coastguard Worker GENX(3DPRIMITIVE_EXTENDED_pack)(dst_ptr, &v); 98*61046927SAndroid Build Coastguard Worker} 99*61046927SAndroid Build Coastguard Worker#endif 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Workervoid genX(write_MI_BATCH_BUFFER_START)(global void *dst_ptr, uint64_t addr) 102*61046927SAndroid Build Coastguard Worker{ 103*61046927SAndroid Build Coastguard Worker struct GENX(MI_BATCH_BUFFER_START) v = { 104*61046927SAndroid Build Coastguard Worker GENX(MI_BATCH_BUFFER_START_header), 105*61046927SAndroid Build Coastguard Worker .AddressSpaceIndicator = ASI_PPGTT, 106*61046927SAndroid Build Coastguard Worker .BatchBufferStartAddress = addr, 107*61046927SAndroid Build Coastguard Worker }; 108*61046927SAndroid Build Coastguard Worker GENX(MI_BATCH_BUFFER_START_pack)(dst_ptr, &v); 109*61046927SAndroid Build Coastguard Worker} 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Workervoid genX(write_draw)(global uint32_t *dst_ptr, 112*61046927SAndroid Build Coastguard Worker global void *indirect_ptr, 113*61046927SAndroid Build Coastguard Worker global uint32_t *draw_id_ptr, 114*61046927SAndroid Build Coastguard Worker uint32_t draw_id, 115*61046927SAndroid Build Coastguard Worker uint32_t instance_multiplier, 116*61046927SAndroid Build Coastguard Worker bool is_indexed, 117*61046927SAndroid Build Coastguard Worker bool is_predicated, 118*61046927SAndroid Build Coastguard Worker bool uses_tbimr, 119*61046927SAndroid Build Coastguard Worker bool uses_base, 120*61046927SAndroid Build Coastguard Worker bool uses_drawid, 121*61046927SAndroid Build Coastguard Worker uint32_t mocs) 122*61046927SAndroid Build Coastguard Worker{ 123*61046927SAndroid Build Coastguard Worker#if GFX_VER <= 9 124*61046927SAndroid Build Coastguard Worker if (uses_base || uses_drawid) { 125*61046927SAndroid Build Coastguard Worker uint32_t vertex_buffer_count = 126*61046927SAndroid Build Coastguard Worker (uses_base ? 1 : 0) + (uses_drawid ? 1 : 0); 127*61046927SAndroid Build Coastguard Worker genX(write_3DSTATE_VERTEX_BUFFERS)(dst_ptr, vertex_buffer_count); 128*61046927SAndroid Build Coastguard Worker dst_ptr += 1; /* GENX(3DSTATE_VERTEX_BUFFERS_length); */ 129*61046927SAndroid Build Coastguard Worker if (uses_base) { 130*61046927SAndroid Build Coastguard Worker uint64_t base_addr = (uint64_t)indirect_ptr + (is_indexed ? 12 : 8); 131*61046927SAndroid Build Coastguard Worker genX(write_VERTEX_BUFFER_STATE)(dst_ptr, mocs, 31, base_addr, 8, 0); 132*61046927SAndroid Build Coastguard Worker dst_ptr += GENX(VERTEX_BUFFER_STATE_length); 133*61046927SAndroid Build Coastguard Worker } 134*61046927SAndroid Build Coastguard Worker if (uses_drawid) { 135*61046927SAndroid Build Coastguard Worker *draw_id_ptr = draw_id; 136*61046927SAndroid Build Coastguard Worker genX(write_VERTEX_BUFFER_STATE)(dst_ptr, mocs, 32, 137*61046927SAndroid Build Coastguard Worker (uint64_t)draw_id_ptr, 4, 0); 138*61046927SAndroid Build Coastguard Worker dst_ptr += GENX(VERTEX_BUFFER_STATE_length); 139*61046927SAndroid Build Coastguard Worker } 140*61046927SAndroid Build Coastguard Worker } 141*61046927SAndroid Build Coastguard Worker 142*61046927SAndroid Build Coastguard Worker if (is_indexed) { 143*61046927SAndroid Build Coastguard Worker VkDrawIndexedIndirectCommand data = 144*61046927SAndroid Build Coastguard Worker *((global VkDrawIndexedIndirectCommand *)indirect_ptr); 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Worker genX(write_3DPRIMITIVE)(dst_ptr, 147*61046927SAndroid Build Coastguard Worker is_predicated, 148*61046927SAndroid Build Coastguard Worker is_indexed, 149*61046927SAndroid Build Coastguard Worker uses_tbimr, 150*61046927SAndroid Build Coastguard Worker data.indexCount, 151*61046927SAndroid Build Coastguard Worker data.firstIndex, 152*61046927SAndroid Build Coastguard Worker data.instanceCount * instance_multiplier, 153*61046927SAndroid Build Coastguard Worker data.firstInstance, 154*61046927SAndroid Build Coastguard Worker data.vertexOffset); 155*61046927SAndroid Build Coastguard Worker } else { 156*61046927SAndroid Build Coastguard Worker VkDrawIndirectCommand data = 157*61046927SAndroid Build Coastguard Worker *((global VkDrawIndirectCommand *)indirect_ptr); 158*61046927SAndroid Build Coastguard Worker 159*61046927SAndroid Build Coastguard Worker genX(write_3DPRIMITIVE)(dst_ptr, 160*61046927SAndroid Build Coastguard Worker is_predicated, 161*61046927SAndroid Build Coastguard Worker is_indexed, 162*61046927SAndroid Build Coastguard Worker uses_tbimr, 163*61046927SAndroid Build Coastguard Worker data.vertexCount, 164*61046927SAndroid Build Coastguard Worker data.firstVertex, 165*61046927SAndroid Build Coastguard Worker data.instanceCount * instance_multiplier, 166*61046927SAndroid Build Coastguard Worker data.firstInstance, 167*61046927SAndroid Build Coastguard Worker 0 /* base_vertex_location */); 168*61046927SAndroid Build Coastguard Worker } 169*61046927SAndroid Build Coastguard Worker#else 170*61046927SAndroid Build Coastguard Worker if (is_indexed) { 171*61046927SAndroid Build Coastguard Worker VkDrawIndexedIndirectCommand data = 172*61046927SAndroid Build Coastguard Worker *((global VkDrawIndexedIndirectCommand *)indirect_ptr); 173*61046927SAndroid Build Coastguard Worker 174*61046927SAndroid Build Coastguard Worker genX(write_3DPRIMITIVE_EXTENDED)(dst_ptr, 175*61046927SAndroid Build Coastguard Worker is_predicated, 176*61046927SAndroid Build Coastguard Worker is_indexed, 177*61046927SAndroid Build Coastguard Worker uses_tbimr, 178*61046927SAndroid Build Coastguard Worker data.indexCount, 179*61046927SAndroid Build Coastguard Worker data.firstIndex, 180*61046927SAndroid Build Coastguard Worker data.instanceCount * instance_multiplier, 181*61046927SAndroid Build Coastguard Worker data.firstInstance, 182*61046927SAndroid Build Coastguard Worker data.vertexOffset, 183*61046927SAndroid Build Coastguard Worker data.vertexOffset, 184*61046927SAndroid Build Coastguard Worker data.firstInstance, 185*61046927SAndroid Build Coastguard Worker draw_id); 186*61046927SAndroid Build Coastguard Worker } else { 187*61046927SAndroid Build Coastguard Worker VkDrawIndirectCommand data = 188*61046927SAndroid Build Coastguard Worker *((global VkDrawIndirectCommand *)indirect_ptr); 189*61046927SAndroid Build Coastguard Worker 190*61046927SAndroid Build Coastguard Worker genX(write_3DPRIMITIVE_EXTENDED)(dst_ptr, 191*61046927SAndroid Build Coastguard Worker is_predicated, 192*61046927SAndroid Build Coastguard Worker is_indexed, 193*61046927SAndroid Build Coastguard Worker uses_tbimr, 194*61046927SAndroid Build Coastguard Worker data.vertexCount, 195*61046927SAndroid Build Coastguard Worker data.firstVertex, 196*61046927SAndroid Build Coastguard Worker data.instanceCount * instance_multiplier, 197*61046927SAndroid Build Coastguard Worker data.firstInstance, 198*61046927SAndroid Build Coastguard Worker 0 /* base_vertex_location */, 199*61046927SAndroid Build Coastguard Worker data.firstVertex, 200*61046927SAndroid Build Coastguard Worker data.firstInstance, 201*61046927SAndroid Build Coastguard Worker draw_id); 202*61046927SAndroid Build Coastguard Worker } 203*61046927SAndroid Build Coastguard Worker#endif 204*61046927SAndroid Build Coastguard Worker} 205