<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 12, 2016 at 2:54 PM, Timothy Arceri <span dir="ltr"><<a href="mailto:timothy.arceri@collabora.com" target="_blank">timothy.arceri@collabora.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Sat, 2016-11-12 at 13:34 -0800, Jason Ekstrand wrote:<br>
<br>
I have two questions and two suggestions below. <br>
<br>
With the suggestions addressed and assuming the answer to both<br>
questions is yes, Patch 7-8 are:<br>
<br>
Reviewed-by: Timothy Arceri <<a href="mailto:timothy.arceri@collabora.com">timothy.arceri@collabora.com</a>><br>
<div><div class="h5"><br>
> ---<br>
>  src/intel/vulkan/gen7_<wbr>pipeline.c      | 48 +----------------------<br>
>  src/intel/vulkan/gen8_<wbr>pipeline.c      | 62 +----------------------<br>
> ------<br>
>  src/intel/vulkan/genX_<wbr>pipeline_util.h | 73<br>
> ++++++++++++++++++++++++++++++<wbr>+++++<br>
>  3 files changed, 75 insertions(+), 108 deletions(-)<br>
><br>
> diff --git a/src/intel/vulkan/gen7_<wbr>pipeline.c<br>
> b/src/intel/vulkan/gen7_<wbr>pipeline.c<br>
> index e604c25..52577f5 100644<br>
> --- a/src/intel/vulkan/gen7_<wbr>pipeline.c<br>
> +++ b/src/intel/vulkan/gen7_<wbr>pipeline.c<br>
> @@ -105,53 +105,7 @@ genX(graphics_pipeline_create)<wbr>(<br>
>  #endif<br>
>  <br>
>     emit_3dstate_vs(pipeline);<br>
> -<br>
> -   const struct brw_gs_prog_data *gs_prog_data =<br>
> get_gs_prog_data(pipeline);<br>
> -<br>
> -   if (!anv_pipeline_has_stage(<wbr>pipeline, MESA_SHADER_GEOMETRY)) {<br>
> -      anv_batch_emit(&<wbr>pipeline->batch, GENX(3DSTATE_GS), gs);<br>
> -   } else {<br>
> -      const struct anv_shader_bin *gs_bin =<br>
> -         pipeline->shaders[<wbr>MESA_SHADER_GEOMETRY];<br>
> -<br>
> -      anv_batch_emit(&<wbr>pipeline->batch, GENX(3DSTATE_GS), gs) {<br>
> -         gs.<wbr>KernelStartPointer         = gs_bin->kernel.offset;<br>
> -<br>
> -         gs.<wbr>ScratchSpaceBasePointer = (struct anv_address) {<br>
> -            .bo = anv_scratch_pool_alloc(device, &device-<br>
> >scratch_pool,<br>
> -                             <wbr>            MESA_SHADER_<wbr>GEOMETRY,<br>
> -                             <wbr>            gs_prog_data-<br>
> >base.base.total_scratch),<br>
> -            .offset = 0,<br>
> -         };<br>
> -         gs.<wbr>PerThreadScratchSpace      =<br>
> scratch_space(&gs_prog_data-><wbr>base.base);<br>
> -<br>
> -         gs.OutputVertexSize <wbr>          = gs_prog_data-<br>
> >output_vertex_size_hwords * 2 - 1;<br>
> -         gs.OutputTopology   <wbr>          = gs_prog_data-<br>
> >output_topology;<br>
> -         gs.<wbr>VertexURBEntryReadLength   = gs_prog_data-<br>
> >base.urb_read_length;<br>
> -         gs.<wbr>IncludeVertexHandles       = gs_prog_data-<br>
> >base.include_vue_handles;<br>
> -<br>
> -         gs.<wbr>DispatchGRFStartRegisterForURB<wbr>Data =<br>
> -            gs_prog_data-><wbr>base.base.dispatch_grf_start_<wbr>reg;<br>
> -<br>
> -         gs.SamplerCount     <wbr>         = get_sampler_count(gs_bin);<br>
> -         gs.<wbr>BindingTableEntryCount    =<br>
> get_binding_table_entry_count(<wbr>gs_bin);<br>
> -<br>
> -         gs.<wbr>MaximumNumberofThreads     = devinfo->max_gs_threads -<br>
> 1;<br>
> -         /* This in the next dword on HSW. */<br>
> -         gs.<wbr>ControlDataFormat          = gs_prog_data-<br>
> >control_data_format;<br>
> -         gs.<wbr>ControlDataHeaderSize      = gs_prog_data-<br>
> >control_data_header_size_<wbr>hwords;<br>
> -         gs.InstanceControl  <wbr>          = MAX2(gs_prog_data-<br>
> >invocations, 1) - 1;<br>
> -         gs.DispatchMode     <wbr>          = gs_prog_data-<br>
> >base.dispatch_mode;<br>
> -         gs.StatisticsEnable <wbr>          = true;<br>
> -         gs.<wbr>IncludePrimitiveID         = gs_prog_data-<br>
> >include_primitive_id;<br>
> -#     if (GEN_IS_HASWELL)<br>
> -         gs.ReorderMode      <wbr>          = REORDER_TRAILING;<br>
<br>
</div></div>Shouldn't we have changed REORDER_TRAILING to TRAILING in<br>
src/intel/genxml/gen75.xml in the previous patch?<br></blockquote><div><br></div><div>Yeah, I'll do that.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
> -#     else<br>
> -         gs.ReorderEnable    <wbr>          = true;<br>
> -#     endif<br>
> -         gs.FunctionEnable   <wbr>          = true;<br>
> -      }<br>
> -   }<br>
> +   emit_3dstate_gs(pipeline);<br>
>  <br>
>     if (!anv_pipeline_has_stage(<wbr>pipeline, MESA_SHADER_FRAGMENT)) {<br>
>        anv_batch_emit(&<wbr>pipeline->batch, GENX(3DSTATE_SBE), sbe);<br>
> diff --git a/src/intel/vulkan/gen8_<wbr>pipeline.c<br>
> b/src/intel/vulkan/gen8_<wbr>pipeline.c<br>
> index 1320a13..5816bd4 100644<br>
> --- a/src/intel/vulkan/gen8_<wbr>pipeline.c<br>
> +++ b/src/intel/vulkan/gen8_<wbr>pipeline.c<br>
> @@ -53,9 +53,6 @@ genX(graphics_pipeline_create)<wbr>(<br>
>  {<br>
>     ANV_FROM_HANDLE(anv_<wbr>device, device, _device);<br>
>     ANV_FROM_HANDLE(anv_<wbr>render_pass, pass, pCreateInfo->renderPass);<br>
> -   const struct anv_physical_device *physical_device =<br>
> -      &device->instance-><wbr>physicalDevice;<br>
> -   const struct gen_device_info *devinfo = &physical_device->info;<br>
>     struct anv_subpass *subpass = &pass->subpasses[pCreateInfo-<br>
> >subpass];<br>
>     struct anv_pipeline *pipeline;<br>
>     VkResult result;<br>
> @@ -112,64 +109,7 @@ genX(graphics_pipeline_create)<wbr>(<br>
>           wm_prog_data ? wm_prog_data->barycentric_<wbr>interp_modes : 0;<br>
>     }<br>
>  <br>
> -   if (!anv_pipeline_has_stage(<wbr>pipeline, MESA_SHADER_GEOMETRY)) {<br>
> -      anv_batch_emit(&<wbr>pipeline->batch, GENX(3DSTATE_GS), gs);<br>
> -   } else {<br>
> -      const struct brw_gs_prog_data *gs_prog_data =<br>
> get_gs_prog_data(pipeline);<br>
> -      const struct anv_shader_bin *gs_bin =<br>
> -         pipeline->shaders[<wbr>MESA_SHADER_GEOMETRY];<br>
> -<br>
> -      uint32_t offset = 1;<br>
> -      uint32_t length = (gs_prog_data->base.vue_map.<wbr>num_slots + 1) /<br>
> 2 - offset;<br>
> -<br>
> -      anv_batch_emit(&<wbr>pipeline->batch, GENX(3DSTATE_GS), gs) {<br>
> -         gs.<wbr>SingleProgramFlow       = false;<br>
> -         gs.<wbr>KernelStartPointer      = gs_bin->kernel.offset;<br>
> -         gs.VectorMaskEnable <wbr>       = false;<br>
> -         gs.SamplerCount     <wbr>       = get_sampler_count(gs_bin);<br>
> -         gs.<wbr>BindingTableEntryCount  =<br>
> get_binding_table_entry_count(<wbr>gs_bin);<br>
> -         gs.<wbr>ExpectedVertexCount     = gs_prog_data->vertices_in;<br>
> -<br>
> -         gs.<wbr>ScratchSpaceBasePointer = (struct anv_address) {<br>
> -            .bo = anv_scratch_pool_alloc(device, &device-<br>
> >scratch_pool,<br>
> -                             <wbr>            MESA_SHADER_<wbr>GEOMETRY,<br>
> -                             <wbr>            gs_prog_data-<br>
> >base.base.total_scratch),<br>
> -            .offset = 0,<br>
> -         };<br>
> -         gs.<wbr>PerThreadScratchSpace   = scratch_space(&gs_prog_data-<br>
> >base.base);<br>
> -         gs.OutputVertexSize <wbr>       = gs_prog_data-<br>
> >output_vertex_size_hwords * 2 - 1;<br>
> -         gs.OutputTopology   <wbr>       = gs_prog_data->output_topology;<br>
> -         gs.<wbr>VertexURBEntryReadLength = gs_prog_data-<br>
> >base.urb_read_length;<br>
> -         gs.<wbr>IncludeVertexHandles    = gs_prog_data-<br>
> >base.include_vue_handles;<br>
> -<br>
> -         gs.<wbr>DispatchGRFStartRegisterForURB<wbr>Data =<br>
> -            gs_prog_data-><wbr>base.base.dispatch_grf_start_<wbr>reg;<br>
> -<br>
> -         gs.<wbr>MaximumNumberofThreads  = devinfo->max_gs_threads / 2 -<br>
> 1;<br>
> -         gs.<wbr>ControlDataHeaderSize   = gs_prog_data-<br>
> >control_data_header_size_<wbr>hwords;<br>
> -         gs.DispatchMode     <wbr>       = gs_prog_data-<br>
> >base.dispatch_mode;<br>
> -         gs.StatisticsEnable <wbr>       = true;<br>
> -         gs.<wbr>IncludePrimitiveID      = gs_prog_data-<br>
> >include_primitive_id;<br>
> -         gs.ReorderMode      <wbr>       = TRAILING;<br>
> -         gs.FunctionEnable   <wbr>       = true;<br>
> -<br>
> -         gs.<wbr>ControlDataFormat       = gs_prog_data-<br>
> >control_data_format;<br>
> -<br>
> -         gs.StaticOutput     <wbr>       = gs_prog_data-<br>
> >static_vertex_count >= 0;<br>
> -         gs.<wbr>StaticOutputVertexCount =<br>
> -            gs_prog_data-><wbr>static_vertex_count >= 0 ?<br>
> -            gs_prog_data-><wbr>static_vertex_count : 0;<br>
> -<br>
> -         /* FIXME: mesa sets this based on ctx-<br>
> >Transform.ClipPlanesEnabled:<br>
> -          * UserClipDistanceClipTestEnable<wbr>Bitmask_3DSTATE_GS(v)<br>
> -          * UserClipDistanceCullTestEnable<wbr>Bitmask(v)<br>
> -          */<br>
> -<br>
> -         gs.<wbr>VertexURBEntryOutputReadOffset = offset;<br>
> -         gs.<wbr>VertexURBEntryOutputLength = length;<br>
> -      }<br>
> -   }<br>
> -<br>
> +   emit_3dstate_gs(pipeline);<br>
>     emit_3dstate_vs(pipeline);<br>
>  <br>
>     const int num_thread_bias = GEN_GEN == 8 ? 2 : 1;<br>
> diff --git a/src/intel/vulkan/genX_<wbr>pipeline_util.h<br>
> b/src/intel/vulkan/genX_<wbr>pipeline_util.h<br>
> index 4fa96c8..515cc9a 100644<br>
> --- a/src/intel/vulkan/genX_<wbr>pipeline_util.h<br>
> +++ b/src/intel/vulkan/genX_<wbr>pipeline_util.h<br>
> @@ -1053,4 +1053,77 @@ emit_3dstate_vs(struct anv_pipeline *pipeline)<br>
>     }<br>
>  }<br>
>  <br>
> +static void<br>
> +emit_3dstate_gs(struct anv_pipeline *pipeline)<br>
> +{<br>
> +   const struct gen_device_info *devinfo = &pipeline->device->info;<br>
> +   const struct anv_shader_bin *gs_bin =<br>
> +      pipeline->shaders[MESA_<wbr>SHADER_GEOMETRY];<br>
> +<br>
> +   if (!anv_pipeline_has_stage(<wbr>pipeline, MESA_SHADER_GEOMETRY)) {<br>
> +      anv_batch_emit(&<wbr>pipeline->batch, GENX(3DSTATE_GS), gs);<br>
> +      return;<br>
> +   }<br>
> +<br>
> +   const struct brw_gs_prog_data *gs_prog_data =<br>
> get_gs_prog_data(pipeline);<br>
> +<br>
> +   anv_batch_emit(&pipeline-><wbr>batch, GENX(3DSTATE_GS), gs) {<br>
> +      gs.FunctionEnable      <wbr>    = true;<br>
> +      gs.StatisticsEnable    <wbr>    = true;<br>
> +      gs.KernelStartPointer  <wbr>    = gs_bin->kernel.offset;<br>
> +      gs.DispatchMode        <wbr>    = gs_prog_data->base.dispatch_<wbr>mode;<br>
> +<br>
> +      gs.SingleProgramFlow   <wbr>    = false;<br>
> +      gs.VectorMaskEnable    <wbr>    = false;<br>
> +      gs.SamplerCount        <wbr>    = get_sampler_count(gs_bin);<br>
> +      gs.<wbr>BindingTableEntryCount  =<br>
> get_binding_table_entry_count(<wbr>gs_bin);<br>
> +      gs.<wbr>IncludeVertexHandles    = gs_prog_data-<br>
> >base.include_vue_handles;<br>
> +      gs.IncludePrimitiveID  <wbr>    = gs_prog_data-<br>
> >include_primitive_id;<br>
> +<br>
> +      if (GEN_GEN == 8) {<br>
<br>
</div></div>Just checking this doesn't need to be GEN_GEN >= 8 ??<span class=""><br></span></blockquote><div><br></div><div>No, "== 8" is correct.  They upped the number of GS threads on gen8 but the field was too small so they made you divide by 2.  On Sky Lake the increased the size of the field and removed the divide by 2.  Yeah, it's weird...<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
> +         /* Broadwell is weird.  It needs us to divide by 2. */<br>
> +         gs.<wbr>MaximumNumberofThreads = devinfo->max_gs_threads / 2 -<br>
> 1;<br>
> +      } else {<br>
> +         gs.<wbr>MaximumNumberofThreads = devinfo->max_gs_threads - 1;<br>
> +      }<br>
> +<br>
> +      gs.OutputVertexSize    <wbr>    = gs_prog_data-<br>
> >output_vertex_size_hwords * 2 - 1;<br>
> +      gs.OutputTopology      <wbr>    = gs_prog_data->output_topology;<br>
> +      gs.<wbr>VertexURBEntryReadLength = gs_prog_data-<br>
> >base.urb_read_length;<br>
> +      gs.ControlDataFormat   <wbr>    = gs_prog_data-<br>
> >control_data_format;<br>
> +      gs.<wbr>ControlDataHeaderSize   = gs_prog_data-<br>
> >control_data_header_size_<wbr>hwords;<br>
> +      gs.InstanceControl     <wbr>    = MAX2(gs_prog_data-><wbr>invocations,<br>
> 1) - 1;<br>
<br>
</span>This wasn't previously set for gen8 I take it this doesn't matter?<span class=""><br></span></blockquote><div><br></div><div>I'll break that into its own patch.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
> +#if GEN_GEN >= 8 || GEN_IS_HASWELL<br>
> +      gs.ReorderMode         <wbr>    = TRAILING;<br>
> +#else<br>
> +      gs.ReorderEnable       <wbr>    = true;<br>
> +#endif<br>
<br>
</span>Maybe push this block over 1 more space so everything is aligned<br>
together?<br></blockquote><div><br></div><div>What's not aligned about it?  Do you want a blank line above it or something?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
> +<br>
> +#if GEN_GEN >= 8<br>
> +      gs.ExpectedVertexCount <wbr>    = gs_prog_data->vertices_in;<br>
> +      gs.StaticOutput        <wbr>    = gs_prog_data->static_vertex_<wbr>count<br>
> >= 0;<br>
> +      gs.<wbr>StaticOutputVertexCount = gs_prog_data->static_vertex_<wbr>count<br>
> >= 0 ?<br>
> +                             <wbr>      gs_prog_data->static_<wbr>vertex_count<br>
> : 0;<br>
> +#endif<br>
> +<br>
> +      gs.<wbr>VertexURBEntryReadOffset = 0;<br>
> +      gs.<wbr>VertexURBEntryReadLength = gs_prog_data-<br>
> >base.urb_read_length;<br>
> +      gs.<wbr>DispatchGRFStartRegisterForURB<wbr>Data =<br>
> +         gs_prog_data->base.<wbr>base.dispatch_grf_start_reg;<br>
> +<br>
> +#if GEN_GEN >= 8<br>
> +      gs.<wbr>VertexURBEntryOutputReadOffset = get_urb_output_offset();<br>
> +      gs.<wbr>VertexURBEntryOutputLength    <wbr> =<br>
> get_urb_output_length(gs_bin);<br>
> +<br>
> +     /* TODO */<br>
> +      gs.<wbr>UserClipDistanceClipTestEnable<wbr>Bitmask = 0;<br>
> +      gs.<wbr>UserClipDistanceCullTestEnable<wbr>Bitmask = 0;<br>
> +#endif<br>
> +<br>
> +      gs.<wbr>PerThreadScratchSpace   = get_scratch_space(gs_bin);<br>
> +      gs.<wbr>ScratchSpaceBasePointer =<br>
> +         get_scratch_address(<wbr>pipeline, MESA_SHADER_GEOMETRY,<br>
> gs_bin);<br>
> +   }<br>
> +}<br>
> +<br>
>  #endif /* GENX_PIPELINE_UTIL_H */<br>
</div></div></blockquote></div><br></div></div>