• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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