diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index cc6630164e7..3a05759f13b 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -1115,7 +1115,7 @@ vk_to_nv9097_provoking_vertex(VkProvokingVertexModeEXT vk_mode) static void nvk_flush_rs_state(struct nvk_cmd_buffer *cmd) { - struct nv_push *p = nvk_cmd_buffer_push(cmd, 34); + struct nv_push *p = nvk_cmd_buffer_push(cmd, 36); const struct vk_dynamic_graphics_state *dyn = &cmd->vk.dynamic_graphics_state; @@ -1123,6 +1123,35 @@ nvk_flush_rs_state(struct nvk_cmd_buffer *cmd) if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_RASTERIZER_DISCARD_ENABLE)) P_IMMD(p, NV9097, SET_RASTER_ENABLE, !dyn->rs.rasterizer_discard_enable); + if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_DEPTH_CLIP_ENABLE) || + BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_DEPTH_CLAMP_ENABLE)) { + const bool z_clamp = dyn->rs.depth_clamp_enable; + const bool z_clip = vk_rasterization_state_depth_clip_enable(&dyn->rs); + P_IMMD(p, NVC397, SET_VIEWPORT_CLIP_CONTROL, { + /* TODO: Fix pre-Volta + * + * This probably involves a few macros, one which stases viewport + * min/maxDepth in scratch states and one which goes here and + * emits either min/maxDepth or -/+INF as needed. + */ + .min_z_zero_max_z_one = MIN_Z_ZERO_MAX_Z_ONE_FALSE, + .z_clip_range = nvk_cmd_buffer_3d_cls(cmd) >= VOLTA_A + ? ((z_clamp || z_clip) + ? Z_CLIP_RANGE_MIN_Z_MAX_Z + :Z_CLIP_RANGE_MINUS_INF_PLUS_INF) + : Z_CLIP_RANGE_USE_FIELD_MIN_Z_ZERO_MAX_Z_ONE, + + .pixel_min_z = z_clip ? PIXEL_MIN_Z_CLIP : PIXEL_MIN_Z_CLAMP, + .pixel_max_z = z_clip ? PIXEL_MAX_Z_CLIP : PIXEL_MAX_Z_CLAMP, + + .geometry_guardband = GEOMETRY_GUARDBAND_SCALE_256, + .line_point_cull_guardband = LINE_POINT_CULL_GUARDBAND_SCALE_256, + .geometry_clip = z_clip ? GEOMETRY_CLIP_FRUSTUM_XYZ_CLIP : + GEOMETRY_CLIP_FRUSTUM_XY_CLIP, + .geometry_guardband_z = GEOMETRY_GUARDBAND_Z_SCALE_256, + }); + } + if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_POLYGON_MODE)) { uint32_t polygon_mode = vk_to_nv9097_polygon_mode(dyn->rs.polygon_mode); P_MTHD(p, NV9097, SET_FRONT_POLYGON_MODE); diff --git a/src/nouveau/vulkan/nvk_graphics_pipeline.c b/src/nouveau/vulkan/nvk_graphics_pipeline.c index 868ea8063b0..6410ac3660f 100644 --- a/src/nouveau/vulkan/nvk_graphics_pipeline.c +++ b/src/nouveau/vulkan/nvk_graphics_pipeline.c @@ -35,36 +35,9 @@ emit_pipeline_vp_state(struct nv_push *p, } static void -emit_pipeline_rs_state(struct nv_push *p, struct nvk_device *dev, +emit_pipeline_rs_state(struct nv_push *p, const struct vk_rasterization_state *rs) { - bool z_clamp = rs->depth_clamp_enable; - bool z_clip = vk_rasterization_state_depth_clip_enable(rs); - - P_IMMD(p, NVC397, SET_VIEWPORT_CLIP_CONTROL, { - /* TODO: Fix pre-Volta - * - * This probably involves a few macros, one which stases viewport - * min/maxDepth in scratch states and one which goes here and - * emits either min/maxDepth or -/+INF as needed. - */ - .min_z_zero_max_z_one = MIN_Z_ZERO_MAX_Z_ONE_FALSE, - .z_clip_range = dev->pdev->info.cls_eng3d >= VOLTA_A - ? ((z_clamp || z_clip) - ? Z_CLIP_RANGE_MIN_Z_MAX_Z - :Z_CLIP_RANGE_MINUS_INF_PLUS_INF) - : Z_CLIP_RANGE_USE_FIELD_MIN_Z_ZERO_MAX_Z_ONE, - - .pixel_min_z = z_clip ? PIXEL_MIN_Z_CLIP : PIXEL_MIN_Z_CLAMP, - .pixel_max_z = z_clip ? PIXEL_MAX_Z_CLIP : PIXEL_MAX_Z_CLAMP, - - .geometry_guardband = GEOMETRY_GUARDBAND_SCALE_256, - .line_point_cull_guardband = LINE_POINT_CULL_GUARDBAND_SCALE_256, - .geometry_clip = z_clip ? GEOMETRY_CLIP_FRUSTUM_XYZ_CLIP : - GEOMETRY_CLIP_FRUSTUM_XY_CLIP, - .geometry_guardband_z = GEOMETRY_GUARDBAND_Z_SCALE_256, - }); - P_IMMD(p, NV9097, SET_RASTER_INPUT, rs->rasterization_stream); } @@ -501,7 +474,7 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, if (state.ts) emit_pipeline_ts_state(&push, state.ts); if (state.vp) emit_pipeline_vp_state(&push, state.vp); - if (state.rs) emit_pipeline_rs_state(&push, dev, state.rs); + if (state.rs) emit_pipeline_rs_state(&push, state.rs); if (state.ms) emit_pipeline_ms_state(&push, state.ms, force_max_samples); if (state.cb) emit_pipeline_cb_state(&push, state.cb); diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index a3844dc67da..8fc19d3f173 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -283,7 +283,7 @@ nvk_get_device_features(const struct nv_device_info *info, /* VK_EXT_extended_dynamic_state3 */ .extendedDynamicState3TessellationDomainOrigin = false, - .extendedDynamicState3DepthClampEnable = false, + .extendedDynamicState3DepthClampEnable = true, .extendedDynamicState3PolygonMode = true, .extendedDynamicState3RasterizationSamples = false, .extendedDynamicState3SampleMask = false, @@ -296,7 +296,7 @@ nvk_get_device_features(const struct nv_device_info *info, .extendedDynamicState3RasterizationStream = false, .extendedDynamicState3ConservativeRasterizationMode = false, .extendedDynamicState3ExtraPrimitiveOverestimationSize = false, - .extendedDynamicState3DepthClipEnable = false, + .extendedDynamicState3DepthClipEnable = true, .extendedDynamicState3SampleLocationsEnable = info->cls_eng3d >= MAXWELL_B, .extendedDynamicState3ColorBlendAdvanced = false, .extendedDynamicState3ProvokingVertexMode = true,