diff --git a/src/nouveau/compiler/nak.h b/src/nouveau/compiler/nak.h index 7ee830c124c..3006364668f 100644 --- a/src/nouveau/compiler/nak.h +++ b/src/nouveau/compiler/nak.h @@ -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 */ diff --git a/src/nouveau/compiler/nak/api.rs b/src/nouveau/compiler/nak/api.rs index 437285b44d3..63794c3a55f 100644 --- a/src/nouveau/compiler/nak/api.rs +++ b/src/nouveau/compiler/nak/api.rs @@ -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(), }, } diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index 89659951b14..3c00e240dac 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -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"), diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index 52dc521beb2..a247b8d7383 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -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)] diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index f38aceda33a..a615f715e36 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -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, diff --git a/src/nouveau/vulkan/nvk_mme.h b/src/nouveau/vulkan/nvk_mme.h index a4f0bf26f5c..fd95cc2b98e 100644 --- a/src/nouveau/vulkan/nvk_mme.h +++ b/src/nouveau/vulkan/nvk_mme.h @@ -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); diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index 6fd598bf739..350f7199417 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -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) {