<div dir="ltr"><div>Yup.</div><div><br></div><div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jan 16, 2019 at 6:08 AM Iago Toral <<a href="mailto:itoral@igalia.com">itoral@igalia.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Jason, does this version look good to you?<br>
<br>
On Mon, 2019-01-14 at 12:42 +0100, Iago Toral Quiroga wrote:<br>
> We had defined MAX_IMAGES as 8, which we used to size the array for<br>
> image push constant data. The comment there stated that this was for<br>
> gen8, but anv_nir_apply_pipeline_layout runs for all gens and writes<br>
> that array, asserting that we don't exceed that number of images,<br>
> which imposes a limit of MAX_IMAGES on all gens.<br>
> <br>
> Furthermore, despite this, we are exposing up to 64 images per shader<br>
> stage on all gens, gen8 included.<br>
> <br>
> This patch lowers the number of images we expose in gen8 to 8 and<br>
> keeps 64 images for gen9+ while making sure that only pre-SKL gens<br>
> use push constant space to handle images.<br>
> <br>
> v2:<br>
>  - <= instead of < in the assert (Eric, Lionel)<br>
>  - Change the way the assertion is written (Eric)<br>
> <br>
> v3:<br>
>  - Revert the way the assertion is written to the form it had in v1,<br>
>    the version in v2 was not equivalent and was incorrect. (Lionel)<br>
> <br>
> v4:<br>
>  - gen9+ doesn't need push constants for images at all (Jason)<br>
> ---<br>
>  src/intel/vulkan/anv_device.c                 |  7 ++++--<br>
>  .../vulkan/anv_nir_apply_pipeline_layout.c    |  4 +--<br>
>  src/intel/vulkan/anv_private.h                |  5 ++--<br>
>  src/intel/vulkan/genX_cmd_buffer.c            | 25 +++++++++++++--<br>
> ----<br>
>  4 files changed, 28 insertions(+), 13 deletions(-)<br>
> <br>
> diff --git a/src/intel/vulkan/anv_device.c<br>
> b/src/intel/vulkan/anv_device.c<br>
> index 523f1483e29..f85458b672e 100644<br>
> --- a/src/intel/vulkan/anv_device.c<br>
> +++ b/src/intel/vulkan/anv_device.c<br>
> @@ -987,9 +987,12 @@ void anv_GetPhysicalDeviceProperties(<br>
>     const uint32_t max_samplers = (devinfo->gen >= 8 || devinfo-<br>
> >is_haswell) ?<br>
>                                   128 : 16;<br>
>  <br>
> +   const uint32_t max_images = devinfo->gen < 9 ? MAX_GEN8_IMAGES :<br>
> MAX_IMAGES;<br>
> +<br>
>     VkSampleCountFlags sample_counts =<br>
>        isl_device_get_sample_counts(&pdevice->isl_dev);<br>
>  <br>
> +<br>
>     VkPhysicalDeviceLimits limits = {<br>
>        .maxImageDimension1D                      = (1 << 14),<br>
>        .maxImageDimension2D                      = (1 << 14),<br>
> @@ -1009,7 +1012,7 @@ void anv_GetPhysicalDeviceProperties(<br>
>        .maxPerStageDescriptorUniformBuffers      = 64,<br>
>        .maxPerStageDescriptorStorageBuffers      = 64,<br>
>        .maxPerStageDescriptorSampledImages       = max_samplers,<br>
> -      .maxPerStageDescriptorStorageImages       = 64,<br>
> +      .maxPerStageDescriptorStorageImages       = max_images,<br>
>        .maxPerStageDescriptorInputAttachments    = 64,<br>
>        .maxPerStageResources                     = 250,<br>
>        .maxDescriptorSetSamplers                 = 6 * max_samplers,<br>
> /* number of stages * maxPerStageDescriptorSamplers */<br>
> @@ -1018,7 +1021,7 @@ void anv_GetPhysicalDeviceProperties(<br>
>        .maxDescriptorSetStorageBuffers           = 6 *<br>
> 64,           /* number of stages *<br>
> maxPerStageDescriptorStorageBuffers */<br>
>        .maxDescriptorSetStorageBuffersDynamic    =<br>
> MAX_DYNAMIC_BUFFERS / 2,<br>
>        .maxDescriptorSetSampledImages            = 6 * max_samplers,<br>
> /* number of stages * maxPerStageDescriptorSampledImages */<br>
> -      .maxDescriptorSetStorageImages            = 6 *<br>
> 64,           /* number of stages *<br>
> maxPerStageDescriptorStorageImages */<br>
> +      .maxDescriptorSetStorageImages            = 6 *<br>
> max_images,   /* number of stages *<br>
> maxPerStageDescriptorStorageImages */<br>
>        .maxDescriptorSetInputAttachments         = 256,<br>
>        .maxVertexInputAttributes                 = MAX_VBS,<br>
>        .maxVertexInputBindings                   = MAX_VBS,<br>
> diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c<br>
> b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c<br>
> index b3daf702bc0..623984b0f8c 100644<br>
> --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c<br>
> +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c<br>
> @@ -528,8 +528,8 @@ anv_nir_apply_pipeline_layout(const struct<br>
> anv_physical_device *pdevice,<br>
>        }<br>
>     }<br>
>  <br>
> -   if (map->image_count > 0) {<br>
> -      assert(map->image_count <= MAX_IMAGES);<br>
> +   if (map->image_count > 0 && pdevice->compiler->devinfo->gen < 9)<br>
> {<br>
> +      assert(map->image_count <= MAX_GEN8_IMAGES);<br>
>        assert(shader->num_uniforms == prog_data->nr_params * 4);<br>
>        state.first_image_uniform = shader->num_uniforms;<br>
>        uint32_t *param = brw_stage_prog_data_add_params(prog_data,<br>
> diff --git a/src/intel/vulkan/anv_private.h<br>
> b/src/intel/vulkan/anv_private.h<br>
> index 770254e93ea..47878adb066 100644<br>
> --- a/src/intel/vulkan/anv_private.h<br>
> +++ b/src/intel/vulkan/anv_private.h<br>
> @@ -157,7 +157,8 @@ struct gen_l3_config;<br>
>  #define MAX_SCISSORS    16<br>
>  #define MAX_PUSH_CONSTANTS_SIZE 128<br>
>  #define MAX_DYNAMIC_BUFFERS 16<br>
> -#define MAX_IMAGES 8<br>
> +#define MAX_IMAGES 64<br>
> +#define MAX_GEN8_IMAGES 8<br>
>  #define MAX_PUSH_DESCRIPTORS 32 /* Minimum requirement */<br>
>  <br>
>  /* The kernel relocation API has a limitation of a 32-bit delta<br>
> value<br>
> @@ -1883,7 +1884,7 @@ struct anv_push_constants {<br>
>     uint32_t base_work_group_id[3];<br>
>  <br>
>     /* Image data for image_load_store on pre-SKL */<br>
> -   struct brw_image_param images[MAX_IMAGES];<br>
> +   struct brw_image_param images[MAX_GEN8_IMAGES];<br>
>  };<br>
>  <br>
>  struct anv_dynamic_state {<br>
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c<br>
> b/src/intel/vulkan/genX_cmd_buffer.c<br>
> index 35a70f7fe37..e23f8cfda45 100644<br>
> --- a/src/intel/vulkan/genX_cmd_buffer.c<br>
> +++ b/src/intel/vulkan/genX_cmd_buffer.c<br>
> @@ -2006,6 +2006,7 @@ emit_binding_table(struct anv_cmd_buffer<br>
> *cmd_buffer,<br>
>                     gl_shader_stage stage,<br>
>                     struct anv_state *bt_state)<br>
>  {<br>
> +   const struct gen_device_info *devinfo = &cmd_buffer->device-<br>
> >info;<br>
>     struct anv_subpass *subpass = cmd_buffer->state.subpass;<br>
>     struct anv_cmd_pipeline_state *pipe_state;<br>
>     struct anv_pipeline *pipeline;<br>
> @@ -2063,7 +2064,8 @@ emit_binding_table(struct anv_cmd_buffer<br>
> *cmd_buffer,<br>
>     if (map->surface_count == 0)<br>
>        goto out;<br>
>  <br>
> -   if (map->image_count > 0) {<br>
> +   /* We only use push constant space for images before gen9 */<br>
> +   if (map->image_count > 0 && devinfo->gen < 9) {<br>
>        VkResult result =<br>
>           anv_cmd_buffer_ensure_push_constant_field(cmd_buffer,<br>
> stage, images);<br>
>        if (result != VK_SUCCESS)<br>
> @@ -2177,10 +2179,15 @@ emit_binding_table(struct anv_cmd_buffer<br>
> *cmd_buffer,<br>
>           assert(surface_state.alloc_size);<br>
>           add_surface_state_relocs(cmd_buffer, sstate);<br>
>  <br>
> -         struct brw_image_param *image_param =<br>
> -            &cmd_buffer->state.push_constants[stage]-<br>
> >images[image++];<br>
> +         if (devinfo->gen < 9) {<br>
> +            assert(image < MAX_GEN8_IMAGES);<br>
> +            struct brw_image_param *image_param =<br>
> +               &cmd_buffer->state.push_constants[stage]-<br>
> >images[image];<br>
>  <br>
> -         *image_param = desc->image_view->planes[binding-<br>
> >plane].storage_image_param;<br>
> +            *image_param =<br>
> +               desc->image_view->planes[binding-<br>
> >plane].storage_image_param;<br>
> +         }<br>
> +         image++;<br>
>           break;<br>
>        }<br>
>  <br>
> @@ -2226,10 +2233,14 @@ emit_binding_table(struct anv_cmd_buffer<br>
> *cmd_buffer,<br>
>           add_surface_reloc(cmd_buffer, surface_state,<br>
>                             desc->buffer_view->address);<br>
>  <br>
> -         struct brw_image_param *image_param =<br>
> -            &cmd_buffer->state.push_constants[stage]-<br>
> >images[image++];<br>
> +         if (devinfo->gen < 9) {<br>
> +            assert(image < MAX_GEN8_IMAGES);<br>
> +            struct brw_image_param *image_param =<br>
> +               &cmd_buffer->state.push_constants[stage]-<br>
> >images[image];<br>
>  <br>
> -         *image_param = desc->buffer_view->storage_image_param;<br>
> +            *image_param = desc->buffer_view->storage_image_param;<br>
> +         }<br>
> +         image++;<br>
>           break;<br>
>  <br>
>        default:<br>
<br>
</blockquote></div>