/* * Copyright 2023 Alyssa Rosenzweig * SPDX-License-Identifier: MIT */ #pragma once #include #include #include "poly/geometry.h" #include "nir.h" #include "shader_enums.h" struct nir_def *poly_load_per_vertex_input(struct nir_builder *b, nir_intrinsic_instr *intr, struct nir_def *vertex); nir_def *poly_nir_load_vertex_id(struct nir_builder *b, nir_def *id); bool poly_nir_lower_sw_vs(struct nir_shader *s); bool poly_nir_lower_vs_before_gs(struct nir_shader *vs); struct poly_gs_info { /* Output primitive mode for geometry shaders */ enum mesa_prim mode; /* Number of words per primitive in the count buffer */ unsigned count_words; /* Per-input primitive stride of the output index buffer */ unsigned max_indices; /* Whether the GS includes transform feedback at a compile-time level */ bool xfb; /* Whether a prefix sum is required on the count outputs. Implies xfb */ bool prefix_sum; /* Whether the GS writes to a stream other than stream #0 */ bool multistream; /* Shape of the rasterization draw, named by the instance ID */ enum poly_gs_shape shape; /* Static topology used if shape = POLY_GS_SHAPE_STATIC_INDEXED */ uint8_t topology[64]; }; bool poly_nir_lower_gs(struct nir_shader *gs, struct nir_shader **gs_count, struct nir_shader **gs_copy, struct nir_shader **pre_gs, struct poly_gs_info *info); bool poly_nir_lower_tcs(struct nir_shader *tcs); bool poly_nir_lower_tes(struct nir_shader *tes, bool to_hw_vs); uint64_t poly_tcs_per_vertex_outputs(const struct nir_shader *nir); unsigned poly_tcs_output_stride(const struct nir_shader *nir); bool poly_nir_lower_sysvals(struct nir_shader *nir);