1/* 2 * Copyright 2023 Alyssa Rosenzweig 3 * SPDX-License-Identifier: MIT 4 */ 5 6#include "geometry.h" 7 8uint 9libagx_tcs_patch_vertices_in(constant struct agx_tess_params *p) 10{ 11 return p->input_patch_size; 12} 13 14uint 15libagx_tes_patch_vertices_in(constant struct agx_tess_params *p) 16{ 17 return p->output_patch_size; 18} 19 20ushort 21libagx_tcs_in_offset(uint vtx, gl_varying_slot location, 22 uint64_t crosslane_vs_out_mask) 23{ 24 return libagx_tcs_in_offs(vtx, location, crosslane_vs_out_mask); 25} 26 27uintptr_t 28libagx_tcs_out_address(constant struct agx_tess_params *p, uint patch_id, 29 uint vtx_id, gl_varying_slot location, uint nr_patch_out, 30 uint out_patch_size, uint64_t vtx_out_mask) 31{ 32 uint stride = 33 libagx_tcs_out_stride(nr_patch_out, out_patch_size, vtx_out_mask); 34 35 uint offs = libagx_tcs_out_offs(vtx_id, location, nr_patch_out, 36 out_patch_size, vtx_out_mask); 37 38 return (uintptr_t)(p->tcs_buffer) + (patch_id * stride) + offs; 39} 40 41static uint 42libagx_tes_unrolled_patch_id(uint raw_id) 43{ 44 return raw_id / LIBAGX_TES_PATCH_ID_STRIDE; 45} 46 47uint 48libagx_tes_patch_id(constant struct agx_tess_params *p, uint raw_id) 49{ 50 return libagx_tes_unrolled_patch_id(raw_id) % p->patches_per_instance; 51} 52 53static uint 54tes_vertex_id_in_patch(uint raw_id) 55{ 56 return raw_id % LIBAGX_TES_PATCH_ID_STRIDE; 57} 58 59float2 60libagx_load_tess_coord(constant struct agx_tess_params *p, uint raw_id) 61{ 62 uint patch = libagx_tes_unrolled_patch_id(raw_id); 63 uint vtx = tes_vertex_id_in_patch(raw_id); 64 65 return p->patch_coord_buffer[p->patch_coord_offs[patch] + vtx]; 66} 67 68uintptr_t 69libagx_tes_in_address(constant struct agx_tess_params *p, uint raw_id, 70 uint vtx_id, gl_varying_slot location) 71{ 72 uint patch = libagx_tes_unrolled_patch_id(raw_id); 73 74 return libagx_tcs_out_address(p, patch, vtx_id, location, 75 p->tcs_patch_constants, p->output_patch_size, 76 p->tcs_per_vertex_outputs); 77} 78 79float4 80libagx_tess_level_outer_default(constant struct agx_tess_params *p) 81{ 82 return ( 83 float4)(p->tess_level_outer_default[0], p->tess_level_outer_default[1], 84 p->tess_level_outer_default[2], p->tess_level_outer_default[3]); 85} 86 87float2 88libagx_tess_level_inner_default(constant struct agx_tess_params *p) 89{ 90 return (float2)(p->tess_level_inner_default[0], 91 p->tess_level_inner_default[1]); 92} 93