diff --git a/docs/features.txt b/docs/features.txt index fa79e5f251e..5a1a8dd3639 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -581,7 +581,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_calibrated_timestamps DONE (anv, hasvk, nvk, lvp, radv, vn, tu/a750+) VK_EXT_color_write_enable DONE (anv, hasvk, lvp, nvk, radv, tu, v3dv, vn) VK_EXT_conditional_rendering DONE (anv, hasvk, lvp, nvk, radv, tu, vn) - VK_EXT_conservative_rasterization DONE (anv, nvk, radv, vn) + VK_EXT_conservative_rasterization DONE (anv, nvk, radv, vn, tu/a7xx+) VK_EXT_custom_border_color DONE (anv, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn) VK_EXT_debug_marker DONE (radv) VK_EXT_debug_report DONE (anv, dzn, lvp, nvk, panvk, pvr, radv, tu, v3dv) diff --git a/src/freedreno/.gitlab-ci/reference/crash.log b/src/freedreno/.gitlab-ci/reference/crash.log index 5a6c39e6348..d5ac13adaa6 100644 --- a/src/freedreno/.gitlab-ci/reference/crash.log +++ b/src/freedreno/.gitlab-ci/reference/crash.log @@ -5361,7 +5361,7 @@ clusters: 00000000 GRAS_SU_POLY_OFFSET_OFFSET: 0.000000 00000000 GRAS_SU_POLY_OFFSET_OFFSET_CLAMP: 0.000000 00000000 GRAS_SU_DEPTH_BUFFER_INFO: { DEPTH_FORMAT = DEPTH6_NONE } - 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 00000000 GRAS_SU_PATH_RENDERING_CNTL: { 0 } 00000000 GRAS_VS_LAYER_CNTL: { 0 } 00000000 GRAS_GS_LAYER_CNTL: { 0 } @@ -5604,7 +5604,7 @@ clusters: 00000000 GRAS_SU_POLY_OFFSET_OFFSET: 0.000000 00000000 GRAS_SU_POLY_OFFSET_OFFSET_CLAMP: 0.000000 00000000 GRAS_SU_DEPTH_BUFFER_INFO: { DEPTH_FORMAT = DEPTH6_NONE } - 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 00000000 GRAS_SU_PATH_RENDERING_CNTL: { 0 } 00000000 GRAS_VS_LAYER_CNTL: { 0 } 00000000 GRAS_GS_LAYER_CNTL: { 0 } diff --git a/src/freedreno/.gitlab-ci/reference/crash_prefetch.log b/src/freedreno/.gitlab-ci/reference/crash_prefetch.log index f209942c8b0..c321923d9f3 100644 --- a/src/freedreno/.gitlab-ci/reference/crash_prefetch.log +++ b/src/freedreno/.gitlab-ci/reference/crash_prefetch.log @@ -1991,7 +1991,7 @@ got cmdszdw=83 !+ 100167800 VSC_DRAW_STRM_ADDRESS: 0x100167800 !+ 00000001 UCHE_UNKNOWN_0E12: 0x1 !+ 00000004 UCHE_CLIENT_PF: { PERFSEL = 0x4 } - + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } + 00000000 GRAS_UNKNOWN_80AF: FALSE + 00000000 GRAS_UNKNOWN_8110: 0 !+ 04f06080 GRAS_2D_BLIT_CNTL: { ROTATE = ROTATE_0 | SOLID_COLOR | COLOR_FORMAT = FMT6_16_16_16_16_UNORM | MASK = 0xf | IFMT = R2D_FLOAT32 | RASTER_MODE = TYPE_TILED } @@ -2293,7 +2293,7 @@ got cmdszdw=83 + 100167800 VSC_DRAW_STRM_ADDRESS: 0x100167800 + 00000001 UCHE_UNKNOWN_0E12: 0x1 + 00000004 UCHE_CLIENT_PF: { PERFSEL = 0x4 } - + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } !+ 00e00000 GRAS_BIN_CONTROL: { BINW = 0 | BINH = 0 | RENDER_MODE = RENDERING_PASS | FORCE_LRZ_WRITE_DIS | BUFFERS_LOCATION = BUFFERS_IN_SYSMEM | LRZ_FEEDBACK_ZMODE_MASK = LRZ_FEEDBACK_NONE } + 00000000 GRAS_UNKNOWN_80AF: FALSE + 00000000 GRAS_SC_WINDOW_SCISSOR_TL: { X = 0 | Y = 0 } @@ -5183,7 +5183,7 @@ ESTIMATED CRASH LOCATION! + 100167800 VSC_DRAW_STRM_ADDRESS: 0x100167800 + 00000001 UCHE_UNKNOWN_0E12: 0x1 + 00000004 UCHE_CLIENT_PF: { PERFSEL = 0x4 } - + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } + 00000000 GRAS_UNKNOWN_80AF: FALSE + 00000000 GRAS_UNKNOWN_8110: 0 !+ 04f06000 GRAS_2D_BLIT_CNTL: { ROTATE = ROTATE_0 | COLOR_FORMAT = FMT6_16_16_16_16_UNORM | MASK = 0xf | IFMT = R2D_FLOAT32 | RASTER_MODE = TYPE_TILED } @@ -17189,7 +17189,7 @@ clusters: 00000000 GRAS_SU_POLY_OFFSET_OFFSET: 0.000000 00000000 GRAS_SU_POLY_OFFSET_OFFSET_CLAMP: 0.000000 00000000 GRAS_SU_DEPTH_BUFFER_INFO: { DEPTH_FORMAT = DEPTH6_NONE } - 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 00000000 GRAS_SU_PATH_RENDERING_CNTL: { 0 } 00000000 GRAS_VS_LAYER_CNTL: { 0 } 00000000 GRAS_GS_LAYER_CNTL: { 0 } @@ -17432,7 +17432,7 @@ clusters: 00000000 GRAS_SU_POLY_OFFSET_OFFSET: 0.000000 00000000 GRAS_SU_POLY_OFFSET_OFFSET_CLAMP: 0.000000 00000000 GRAS_SU_DEPTH_BUFFER_INFO: { DEPTH_FORMAT = DEPTH6_NONE } - 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 00000000 GRAS_SU_PATH_RENDERING_CNTL: { 0 } 00000000 GRAS_VS_LAYER_CNTL: { 0 } 00000000 GRAS_GS_LAYER_CNTL: { 0 } diff --git a/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log b/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log index 612a7ff11a3..17faa612ad5 100644 --- a/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log +++ b/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log @@ -153,7 +153,7 @@ cmdstream[0]: 265 dwords SP_UNKNOWN_B183: 0 0000000001058184: 0000: 40b18301 00000000 write GRAS_SU_CONSERVATIVE_RAS_CNTL (8099) - GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 000000000105818c: 0000: 40809901 00000000 write GRAS_SC_CNTL (80a0) GRAS_SC_CNTL: { CCUSINGLECACHELINESIZE = 0x2 | SINGLE_PRIM_MODE = NO_FLUSH | RASTER_MODE = TYPE_TILED | RASTER_DIRECTION = LR_TB | SEQUENCED_THREAD_DISTRIBUTION = DIST_SCREEN_COORD | ROTATION = 0 } @@ -274,7 +274,7 @@ cmdstream[0]: 265 dwords !+ 010dc800 VSC_DRAW_STRM_ADDRESS: 0x10dc800 !+ 03200000 UCHE_UNKNOWN_0E12: 0x3200000 !+ 00000004 UCHE_CLIENT_PF: { PERFSEL = 0x4 } - + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } !+ 00000002 GRAS_SC_CNTL: { CCUSINGLECACHELINESIZE = 0x2 | SINGLE_PRIM_MODE = NO_FLUSH | RASTER_MODE = TYPE_TILED | RASTER_DIRECTION = LR_TB | SEQUENCED_THREAD_DISTRIBUTION = DIST_SCREEN_COORD | ROTATION = 0 } + 00000000 GRAS_UNKNOWN_80AF: FALSE + 00000000 GRAS_LRZ_CNTL: { DIR = 0 } diff --git a/src/freedreno/.gitlab-ci/reference/fd-clouds.log b/src/freedreno/.gitlab-ci/reference/fd-clouds.log index c6dd5711667..a256c48cd9a 100644 --- a/src/freedreno/.gitlab-ci/reference/fd-clouds.log +++ b/src/freedreno/.gitlab-ci/reference/fd-clouds.log @@ -141,7 +141,7 @@ cmdstream[0]: 1023 dwords SP_UNKNOWN_B183: 0 0000000001d91164: 0000: 40b18301 00000000 write GRAS_SU_CONSERVATIVE_RAS_CNTL (8099) - GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 0000000001d9116c: 0000: 40809901 00000000 write GRAS_VS_LAYER_CNTL (809b) GRAS_VS_LAYER_CNTL: { 0 } @@ -927,7 +927,7 @@ cmdstream[0]: 1023 dwords + 00000000 GRAS_SU_POLY_OFFSET_OFFSET: 0.000000 + 00000000 GRAS_SU_POLY_OFFSET_OFFSET_CLAMP: 0.000000 + 00000000 GRAS_SU_DEPTH_BUFFER_INFO: { DEPTH_FORMAT = DEPTH6_NONE } - + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } + 00000000 GRAS_VS_LAYER_CNTL: { 0 } !+ 00000002 GRAS_SC_CNTL: { CCUSINGLECACHELINESIZE = 0x2 | SINGLE_PRIM_MODE = NO_FLUSH | RASTER_MODE = TYPE_TILED | RASTER_DIRECTION = LR_TB | SEQUENCED_THREAD_DISTRIBUTION = DIST_SCREEN_COORD | ROTATION = 0 } !+ 06041e11 GRAS_BIN_CONTROL: { BINW = 544 | BINH = 480 | RENDER_MODE = BINNING_PASS | BUFFERS_LOCATION = BUFFERS_IN_GMEM | LRZ_FEEDBACK_ZMODE_MASK = 0x6 } diff --git a/src/freedreno/.gitlab-ci/reference/prefetch-test.log b/src/freedreno/.gitlab-ci/reference/prefetch-test.log index b9133f5c4e9..f73b81a5ef5 100644 --- a/src/freedreno/.gitlab-ci/reference/prefetch-test.log +++ b/src/freedreno/.gitlab-ci/reference/prefetch-test.log @@ -2535,7 +2535,7 @@ got cmdszdw=438 !+ 0000152b CP_SCRATCH[0x2].REG: 5419 !+ 03200000 UCHE_UNKNOWN_0E12: 0x3200000 !+ 00000004 UCHE_CLIENT_PF: { PERFSEL = 0x4 } - + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } + 00000000 GRAS_VS_LAYER_CNTL: { 0 } !+ 00000002 GRAS_SC_CNTL: { CCUSINGLECACHELINESIZE = 0x2 | SINGLE_PRIM_MODE = NO_FLUSH | RASTER_MODE = TYPE_TILED | RASTER_DIRECTION = LR_TB | SEQUENCED_THREAD_DISTRIBUTION = DIST_SCREEN_COORD | ROTATION = 0 } !+ 00c00000 GRAS_BIN_CONTROL: { BINW = 0 | BINH = 0 | RENDER_MODE = RENDERING_PASS | BUFFERS_LOCATION = BUFFERS_IN_SYSMEM | LRZ_FEEDBACK_ZMODE_MASK = LRZ_FEEDBACK_NONE } @@ -151168,7 +151168,7 @@ clusters: 00000000 GRAS_SU_POLY_OFFSET_OFFSET: 0.000000 00000000 GRAS_SU_POLY_OFFSET_OFFSET_CLAMP: 0.000000 00000000 GRAS_SU_DEPTH_BUFFER_INFO: { DEPTH_FORMAT = DEPTH6_NONE } - 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 00000000 GRAS_SU_PATH_RENDERING_CNTL: { 0 } 00000000 GRAS_VS_LAYER_CNTL: { 0 } 00000000 GRAS_GS_LAYER_CNTL: { 0 } @@ -151411,7 +151411,7 @@ clusters: 00000000 GRAS_SU_POLY_OFFSET_OFFSET: 0.000000 00000000 GRAS_SU_POLY_OFFSET_OFFSET_CLAMP: 0.000000 00000000 GRAS_SU_DEPTH_BUFFER_INFO: { DEPTH_FORMAT = DEPTH6_NONE } - 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = 0 } + 00000000 GRAS_SU_CONSERVATIVE_RAS_CNTL: { SHIFTAMOUNT = NO_SHIFT } 00000000 GRAS_SU_PATH_RENDERING_CNTL: { 0 } 00000000 GRAS_VS_LAYER_CNTL: { 0 } 00000000 GRAS_GS_LAYER_CNTL: { 0 } diff --git a/src/freedreno/registers/adreno/a6xx.xml b/src/freedreno/registers/adreno/a6xx.xml index 4f6bb8129b6..d49919f6344 100644 --- a/src/freedreno/registers/adreno/a6xx.xml +++ b/src/freedreno/registers/adreno/a6xx.xml @@ -3138,7 +3138,12 @@ to upconvert to 32b float internally? - + + + + + + diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc index b16c21f292e..575135a69cd 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc @@ -960,6 +960,8 @@ r3d_common(struct tu_cmd_buffer *cmd, struct tu_cs *cs, enum r3d_type type, .raster_mode = TYPE_TILED, .raster_direction = LR_TB)); tu_cs_emit_regs(cs, A7XX_GRAS_SU_RENDER_CNTL()); + tu_cs_emit_regs(cs, A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL()); + tu_cs_emit_regs(cs, A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL()); } tu_cs_emit_regs(cs, diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 45423b06a87..3e3a9f5f1e9 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -1435,9 +1435,11 @@ tu6_init_static_regs(struct tu_device *dev, struct tu_cs *cs) tu_cs_emit_write_reg(cs, REG_A6XX_SP_UNKNOWN_B183, 0); - tu_cs_emit_write_reg(cs, REG_A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL, 0); tu_cs_emit_write_reg(cs, REG_A6XX_GRAS_UNKNOWN_80AF, 0); if (CHIP == A6XX) { + tu_cs_emit_write_reg(cs, REG_A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL, 0); + tu_cs_emit_regs(cs, A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL()); + tu_cs_emit_write_reg(cs, REG_A6XX_VPC_UNKNOWN_9210, 0); tu_cs_emit_write_reg(cs, REG_A6XX_VPC_UNKNOWN_9211, 0); } @@ -1479,8 +1481,6 @@ tu6_init_static_regs(struct tu_device *dev, struct tu_cs *cs) tu_cs_emit_regs(cs, A7XX_PC_TESS_FACTOR_SIZE(TU_TESS_FACTOR_SIZE)); } - tu_cs_emit_regs(cs, A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL()); - /* There is an optimization to skip executing draw states for draws with no * instances. Instead of simply skipping the draw, internally the firmware * sets a bit in PC_DRAW_INITIATOR that seemingly skips the draw. However diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index 7a2aef230af..9d55e487d64 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -254,6 +254,7 @@ get_device_extensions(const struct tu_physical_device *device, .EXT_calibrated_timestamps = device->info->a7xx.has_persistent_counter, .EXT_color_write_enable = true, .EXT_conditional_rendering = true, + .EXT_conservative_rasterization = device->info->chip >= 7, .EXT_custom_border_color = true, .EXT_depth_clamp_zero_one = true, .EXT_depth_clip_control = true, @@ -609,8 +610,10 @@ tu_get_features(struct tu_physical_device *pdevice, features->extendedDynamicState3AlphaToOneEnable = true; features->extendedDynamicState3DepthClipNegativeOneToOne = true; features->extendedDynamicState3RasterizationStream = true; - features->extendedDynamicState3ConservativeRasterizationMode = false; - features->extendedDynamicState3ExtraPrimitiveOverestimationSize = false; + features->extendedDynamicState3ConservativeRasterizationMode = + pdevice->vk.supported_extensions.EXT_conservative_rasterization; + features->extendedDynamicState3ExtraPrimitiveOverestimationSize = + pdevice->vk.supported_extensions.EXT_conservative_rasterization; features->extendedDynamicState3LineRasterizationMode = true; features->extendedDynamicState3LineStippleEnable = false; features->extendedDynamicState3ProvokingVertexMode = true; @@ -1122,7 +1125,7 @@ tu_get_properties(struct tu_physical_device *pdevice, props->fragmentShadingRateWithSampleMask = true; /* Has wrong gl_SampleMaskIn[0] values with VK_EXT_post_depth_coverage used. */ props->fragmentShadingRateWithShaderSampleMask = false; - props->fragmentShadingRateWithConservativeRasterization = false; + props->fragmentShadingRateWithConservativeRasterization = true; props->fragmentShadingRateWithFragmentShaderInterlock = false; props->fragmentShadingRateWithCustomSampleLocations = true; props->fragmentShadingRateStrictMultiplyCombiner = true; @@ -1340,6 +1343,17 @@ tu_get_properties(struct tu_physical_device *pdevice, props->maxDescriptorSetAccelerationStructures = max_descriptor_set_size; props->maxDescriptorSetUpdateAfterBindAccelerationStructures = max_descriptor_set_size; props->minAccelerationStructureScratchOffsetAlignment = 128; + + /* VK_EXT_conservative_rasterization */ + props->primitiveOverestimationSize = 0.5 + 1 / 256.; + props->maxExtraPrimitiveOverestimationSize = 0.5; + props->extraPrimitiveOverestimationSizeGranularity = 0.5; + props->primitiveUnderestimation = false; + props->conservativePointAndLineRasterization = false; + props->degenerateTrianglesRasterized = true; + props->degenerateLinesRasterized = false; + props->fullyCoveredFragmentShaderInputVariable = false; + props->conservativeRasterizationPostDepthCoverage = false; } static const struct vk_pipeline_cache_object_ops *const cache_import_ops[] = { diff --git a/src/freedreno/vulkan/tu_pipeline.cc b/src/freedreno/vulkan/tu_pipeline.cc index 3fe61dafcd3..22b1c58225b 100644 --- a/src/freedreno/vulkan/tu_pipeline.cc +++ b/src/freedreno/vulkan/tu_pipeline.cc @@ -3093,6 +3093,8 @@ static const enum mesa_vk_dynamic_graphics_state tu_rast_state[] = { MESA_VK_DYNAMIC_RS_RASTERIZATION_STREAM, MESA_VK_DYNAMIC_VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE, MESA_VK_DYNAMIC_RS_LINE_WIDTH, + MESA_VK_DYNAMIC_RS_CONSERVATIVE_MODE, + MESA_VK_DYNAMIC_RS_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE, }; template @@ -3106,7 +3108,7 @@ tu6_rast_size(struct tu_device *dev, if (CHIP == A6XX) { return 15 + (dev->physical_device->info->a6xx.has_legacy_pipeline_shading_rate ? 8 : 0); } else { - return 21; + return 25; } } @@ -3168,10 +3170,36 @@ tu6_emit_rast(struct tu_cs *cs, .stream = rs->rasterization_stream, .discard = rs->rasterizer_discard_enable)); + bool conservative_ras_en = + rs->conservative_mode == + VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT; + tu_cs_emit_regs(cs, RB_RENDER_CNTL(CHIP, .raster_mode = TYPE_TILED, - .raster_direction = LR_TB)); + .raster_direction = LR_TB, + .conservativerasen = conservative_ras_en)); tu_cs_emit_regs(cs, A7XX_GRAS_SU_RENDER_CNTL()); + tu_cs_emit_regs(cs, + A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL(conservative_ras_en)); + + /* There are only two conservative rasterization modes: + * - shift_amount = 0 (NO_SHIFT) - normal rasterization + * - shift_amount = 1 (HALF_PIXEL_SHIFT) - overestimate by half a pixel + * plus the rasterization grid size (1/256) + * - shift_amount = 2 (FULL_PIXEL_SHIFT) - overestimate by another half + * a pixel + * + * We expose a max of 0.5 and a granularity of 0.5, so the app should + * only give us 0 or 0.5 which correspond to HALF_PIXEL_SHIFT and + * FULL_PIXEL_SHIFT respectively. If they give us anything else just + * assume they meant 0.5 as the most conservative choice. + */ + enum a6xx_shift_amount shift_amount = conservative_ras_en ? + (rs->extra_primitive_overestimation_size != 0. ? + FULL_PIXEL_SHIFT : HALF_PIXEL_SHIFT) : NO_SHIFT; + tu_cs_emit_regs(cs, A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL( + .conservativerasen = conservative_ras_en, + .shiftamount = shift_amount)); } /* move to hw ctx init? */