nvk: Add CCW, POINT_MODE flags for set_tess_params

Reviewed-by: Mary Guillemard <mary@mary.zone>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39571>
This commit is contained in:
Mel Henning 2026-01-27 13:21:50 -05:00 committed by Marge Bot
parent 384cc81464
commit 96d9a2b421
7 changed files with 37 additions and 19 deletions

View file

@ -191,8 +191,10 @@ struct nak_shader_info {
enum nak_ts_domain domain;
enum nak_ts_spacing spacing;
enum nak_ts_prims prims;
bool ccw;
bool point_mode;
uint8_t _pad[9];
uint8_t _pad[7];
} ts;
/* Used to initialize the union for other stages */

View file

@ -304,6 +304,8 @@ impl ShaderBin {
domain: ts_info.domain as u8,
spacing: ts_info.spacing as u8,
prims: ts_info.primitives as u8,
ccw: ts_info.ccw,
point_mode: ts_info.point_mode,
_pad: Default::default(),
},
}

View file

@ -120,6 +120,8 @@ fn init_info_from_nir(nak: &nak_compiler, nir: &nir_shader) -> ShaderInfo {
} else {
TessellationPrimitives::TrianglesCW
},
point_mode: info_tess.point_mode(),
ccw: info_tess.ccw(),
})
}
_ => panic!("Unknown shader stage"),

View file

@ -9161,6 +9161,8 @@ pub struct TessellationShaderInfo {
pub domain: TessellationDomain,
pub spacing: TessellationSpacing,
pub primitives: TessellationPrimitives,
pub ccw: bool,
pub point_mode: bool,
}
#[derive(Debug)]

View file

@ -1605,20 +1605,6 @@ nvk_cmd_bind_graphics_shader(struct nvk_cmd_buffer *cmd,
cmd->state.gfx.shaders_dirty |= mesa_to_vk_shader_stage(stage);
}
uint32_t
nvk_mme_tess_params(enum nak_ts_domain domain,
enum nak_ts_spacing spacing,
enum nak_ts_prims prims)
{
/* This is laid out the same as SET_TESSELLATION_PARAMETERS, only with an
* extra bit for lower_left
*/
uint16_t params = ((uint16_t)domain << 0) |
((uint16_t)spacing << 4) |
((uint16_t)prims << 8);
return nvk_mme_val_mask(params, 0x0fff);
}
#define NVK_MME_TESS_PARAMS(domain, spacing, prims) \
NVDEF(NV9097, SET_TESSELLATION_PARAMETERS, DOMAIN_TYPE, domain) | \
NVDEF(NV9097, SET_TESSELLATION_PARAMETERS, SPACING, spacing) | \
@ -1628,6 +1614,27 @@ nvk_mme_tess_params(enum nak_ts_domain domain,
(NVK_MME_TESS_PARAMS(domain, spacing, prims) | flags)
#define LOWER_LEFT BITFIELD_BIT(12)
#define POINT_MODE BITFIELD_BIT(13)
#define CCW BITFIELD_BIT(14)
uint32_t
nvk_mme_tess_params(enum nak_ts_domain domain,
enum nak_ts_spacing spacing,
enum nak_ts_prims prims,
bool ccw, bool point_mode)
{
/* This is laid out the same as SET_TESSELLATION_PARAMETERS, only with an
* extra bit for lower_left
*/
uint16_t params = ((uint16_t)domain << 0) |
((uint16_t)spacing << 4) |
((uint16_t)prims << 8);
if (ccw)
params |= CCW;
if (point_mode)
params |= POINT_MODE;
return nvk_mme_val_mask(params, 0x0fff | POINT_MODE | CCW);
}
static uint32_t
nvk_mme_tess_lower_left(bool lower_left)
@ -1728,7 +1735,7 @@ const struct nvk_mme_test_case nvk_mme_set_tess_params_tests[] = {{
.init = (struct nvk_mme_mthd_data[]) {
{
NVK_SET_MME_SCRATCH(TESS_PARAMS),
NVK_MME_TESS_STATE(TRIANGLE, INTEGER, TRIANGLES_CCW, 0)
NVK_MME_TESS_STATE(TRIANGLE, INTEGER, TRIANGLES_CCW, CCW)
},
{ }
},
@ -1736,7 +1743,7 @@ const struct nvk_mme_test_case nvk_mme_set_tess_params_tests[] = {{
.expected = (struct nvk_mme_mthd_data[]) {
{
NVK_SET_MME_SCRATCH(TESS_PARAMS),
NVK_MME_TESS_STATE(TRIANGLE, INTEGER, TRIANGLES_CCW, LOWER_LEFT)
NVK_MME_TESS_STATE(TRIANGLE, INTEGER, TRIANGLES_CCW, LOWER_LEFT | CCW)
},
{
NV9097_SET_TESSELLATION_PARAMETERS,

View file

@ -251,7 +251,8 @@ void nvk_mme_set_z_clamp(struct mme_builder *b);
uint32_t nvk_mme_tess_params(enum nak_ts_domain domain,
enum nak_ts_spacing spacing,
enum nak_ts_prims prims);
enum nak_ts_prims prims,
bool ccw, bool point_mode);
uint32_t nvk_mme_anti_alias_min_sample_shading(float mss);
uint32_t nvk_mme_shading_rate_control_sample_shading(bool sample_shading);

View file

@ -691,7 +691,9 @@ nvk_shader_fill_push(struct nvk_device *dev,
P_1INC(p, NVB197, CALL_MME_MACRO(NVK_MME_SET_TESS_PARAMS));
P_INLINE_DATA(p, nvk_mme_tess_params(shader->info.ts.domain,
shader->info.ts.spacing,
shader->info.ts.prims));
shader->info.ts.prims,
shader->info.ts.ccw,
shader->info.ts.point_mode));
}
if (shader->info.stage == MESA_SHADER_FRAGMENT) {