[Mesa-dev] [PATCH] anv: gen7/75: enable multisampling (v2)

Anuj Phogat anuj.phogat at gmail.com
Fri Aug 5 20:23:16 UTC 2016


On Fri, Aug 5, 2016 at 10:05 AM, Lionel Landwerlin <
lionel.g.landwerlin at intel.com> wrote:

> Fixes 6 failures from dEQP-VK.api.copy_and_blit.resolve_image.*
>
​No tests are run with --deqp-case=dEQP-VK.api.copy_and_blit.resolve_image.*

This is what i'm seeing on hsw without this patch:
./deqp-vk --deqp-case=dEQP-VK.api.copy_and_blit*
Test run totals:
  Passed:        9/11 (81.8%)
  Failed:        0/11 (0.0%)
  Not supported: 2/11 (18.2%)
  Warnings:      0/11 (0.0%)

>
> Tested on IVB/HSW
>
> v2: Program multisample dispatch mode correctly
>
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> ---
>  src/intel/vulkan/gen7_pipeline.c | 46 ++++++++++++++++++++++++++----
> ----------
>  1 file changed, 30 insertions(+), 16 deletions(-)
>
> diff --git a/src/intel/vulkan/gen7_pipeline.c
> b/src/intel/vulkan/gen7_pipeline.c
> index 6acdd85..2611a2d 100644
> --- a/src/intel/vulkan/gen7_pipeline.c
> +++ b/src/intel/vulkan/gen7_pipeline.c
> @@ -36,27 +36,34 @@
>
>  static void
>  gen7_emit_rs_state(struct anv_pipeline *pipeline,
> -                   const VkPipelineRasterizationStateCreateInfo *info,
> +                   const VkPipelineRasterizationStateCreateInfo *rs_info,
> +                   const VkPipelineMultisampleStateCreateInfo *ms_info,
>                     const struct anv_graphics_pipeline_create_info *extra)
>  {
> +   uint32_t samples = 1;
> +
> +   if (ms_info)
> +      samples = ms_info->rasterizationSamples;
> +
>     struct GENX(3DSTATE_SF) sf = {
>        GENX(3DSTATE_SF_header),
>
>        /* LegacyGlobalDepthBiasEnable */
>
>        .StatisticsEnable                         = true,
> -      .FrontFaceFillMode                        =
> vk_to_gen_fillmode[info->polygonMode],
> -      .BackFaceFillMode                         =
> vk_to_gen_fillmode[info->polygonMode],
> +      .FrontFaceFillMode                        =
> vk_to_gen_fillmode[rs_info->polygonMode],
> +      .BackFaceFillMode                         =
> vk_to_gen_fillmode[rs_info->polygonMode],
>        .ViewTransformEnable                      = !(extra &&
> extra->use_rectlist),
> -      .FrontWinding                             =
> vk_to_gen_front_face[info->frontFace],
> +      .FrontWinding                             =
> vk_to_gen_front_face[rs_info->frontFace],
>        /* bool                                         AntiAliasingEnable;
> */
>
> -      .CullMode                                 =
> vk_to_gen_cullmode[info->cullMode],
> +      .CullMode                                 =
> vk_to_gen_cullmode[rs_info->cullMode],
>
>        /* uint32_t
> LineEndCapAntialiasingRegionWidth; */
>        .ScissorRectangleEnable                   =  !(extra &&
> extra->use_rectlist),
>
> -      /* uint32_t
>  MultisampleRasterizationMode; */
> +      .MultisampleRasterizationMode             = samples > 1 ?
> +          MSDISPMODE_PERPIXEL : MSDISPMODE_PERSAMPLE,
>        /* bool                                         LastPixelEnable; */
>
>        .TriangleStripListProvokingVertexSelect   = 0,
> @@ -67,9 +74,9 @@ gen7_emit_rs_state(struct anv_pipeline *pipeline,
>        /* uint32_t                                     VertexSubPixelPrecisionSelect;
> */
>        .UsePointWidthState                       = false,
>        .PointWidth                               = 1.0,
> -      .GlobalDepthOffsetEnableSolid             = info->depthBiasEnable,
> -      .GlobalDepthOffsetEnableWireframe         = info->depthBiasEnable,
> -      .GlobalDepthOffsetEnablePoint             = info->depthBiasEnable,
> +      .GlobalDepthOffsetEnableSolid             =
> rs_info->depthBiasEnable,
> +      .GlobalDepthOffsetEnableWireframe         =
> rs_info->depthBiasEnable,
> +      .GlobalDepthOffsetEnablePoint             =
> rs_info->depthBiasEnable,
>     };
>
>     GENX(3DSTATE_SF_pack)(NULL, &pipeline->gen7.sf, &sf);
> @@ -108,7 +115,8 @@ genX(graphics_pipeline_create)(
>     emit_vertex_input(pipeline, pCreateInfo->pVertexInputState, extra);
>
>     assert(pCreateInfo->pRasterizationState);
> -   gen7_emit_rs_state(pipeline, pCreateInfo->pRasterizationState, extra);
> +   gen7_emit_rs_state(pipeline, pCreateInfo->pRasterizationState,
> +                      pCreateInfo->pMultisampleState, extra);
>
It'll be nice to split the patch in to two:
- First one carries changes for info -> rs_info.
- Second one with rest of the changes.

>
>     emit_ds_state(pipeline, pCreateInfo->pDepthStencilState, pass,
> subpass);
>
> @@ -121,14 +129,13 @@ genX(graphics_pipeline_create)(
>                       pCreateInfo->pRasterizationState, extra);
>     emit_3dstate_streamout(pipeline, pCreateInfo->pRasterizationState);
>
> -   if (pCreateInfo->pMultisampleState &&
> -       pCreateInfo->pMultisampleState->rasterizationSamples > 1)
> -      anv_finishme("VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_
> CREATE_INFO");
> -
> -   uint32_t samples = 1;
> +   uint32_t samples = pCreateInfo->pMultisampleState
> ->rasterizationSamples;
>     uint32_t log2_samples = __builtin_ffs(samples) - 1;
>
>     anv_batch_emit(&pipeline->batch, GENX(3DSTATE_MULTISAMPLE), ms) {
> +#if GEN_IS_HASWELL
> +      ms.MultiSampleEnable    = samples > 1;
> +#endif
>
​We're not setting this bit in i965 driver without any issues. There is
also a h/w
issue listed in docs
for this bit on hsw.
​


>        ms.PixelLocation        = PIXLOC_CENTER;
>        ms.NumberofMultisamples = log2_samples;
>     }
> @@ -139,7 +146,7 @@ genX(graphics_pipeline_create)(
>
>     const struct brw_vs_prog_data *vs_prog_data =
> get_vs_prog_data(pipeline);
>
> -#if 0
> +#if 0
>     /* From gen7_vs_state.c */
>
>     /**
> @@ -233,6 +240,8 @@ genX(graphics_pipeline_create)(
>           wm.LineAntialiasingRegionWidth         = 1; /* 1.0 pixels */
>           wm.EarlyDepthStencilControl            = EDSC_NORMAL;
>           wm.PointRasterizationRule              = RASTRULE_UPPER_RIGHT;
> +         wm.MultisampleDispatchMode             = samples > 1 ?
> +            MSDISPMODE_PERPIXEL : MSDISPMODE_PERSAMPLE;
>
​Use ​
 wm_prog_data->persample_dispatch
​ here.​ I'm not sure if we really
need this when there is no fragment shader.

>        }
>
>        /* Even if no fragments are ever dispatched, the hardware hangs if
> we
> @@ -312,6 +321,11 @@ genX(graphics_pipeline_create)(
>           }
>
>           wm.BarycentricInterpolationMode        =
> wm_prog_data->barycentric_interp_modes;
> +
> +         wm.MultisampleDispatchMode             = samples > 1 ?
> +            MSRASTMODE_ON_PATTERN : MSRASTMODE_OFF_PIXEL;
>
 Use ​ wm_prog_data->persample_dispatch​ here.​

> +         wm.MultisampleDispatchMode             =
> wm_prog_data->persample_dispatch ?
> +            MSDISPMODE_PERSAMPLE : MSDISPMODE_PERPIXEL;
>
​You're setting the same field twice with different values here. Keep the
2nd line
aligned to ​

​"​wm_prog_data->persample_dispatch".

>        }
>     }
>
> --
> 2.8.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160805/871e2db7/attachment-0001.html>


More information about the mesa-dev mailing list