[Mesa-dev] [PATCH v2] anv/device: fix maximum number of images supported

Lionel Landwerlin lionel.g.landwerlin at intel.com
Fri Jan 11 12:42:57 UTC 2019


On 11/01/2019 12:40, Iago Toral wrote:
> On Fri, 2019-01-11 at 12:31 +0000, Lionel Landwerlin wrote:
>> On 11/01/2019 12:12, Iago Toral Quiroga wrote:
>>> We had defined MAX_IMAGES as 8, which we used to size the array for
>>> image push constant data. The comment there stated that this was
>>> for
>>> gen8, but anv_nir_apply_pipeline_layout runs for all gens and
>>> writes
>>> that array, asserting that we don't exceed that number of images,
>>> which imposes a limit of MAX_IMAGES on all gens.
>>>
>>> Furthermore, despite this, we are exposing up to 64 images per
>>> shader
>>> stage on all gens, gen8 included.
>>>
>>> This patch lowers the number of images we expose in gen8 to 8 and
>>> keeps 64 images for gen9+. It also sets MAX_IMAGES to 64 so we can
>>> actually use up to 64 images in shaders, and then adds an assert
>>> specific to gen8 to check that we never exceed 8.
>>>
>>> v2:
>>>    - <= instead of < in the assert (Eric, Lionel)
>>>    - Change the way the assertion is written (Eric)
>>> ---
>>>    src/intel/vulkan/anv_device.c                    | 7 +++++--
>>>    src/intel/vulkan/anv_nir_apply_pipeline_layout.c | 3 ++-
>>>    src/intel/vulkan/anv_private.h                   | 4 ++--
>>>    3 files changed, 9 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/src/intel/vulkan/anv_device.c
>>> b/src/intel/vulkan/anv_device.c
>>> index 523f1483e2..f85458b672 100644
>>> --- a/src/intel/vulkan/anv_device.c
>>> +++ b/src/intel/vulkan/anv_device.c
>>> @@ -987,9 +987,12 @@ void anv_GetPhysicalDeviceProperties(
>>>       const uint32_t max_samplers = (devinfo->gen >= 8 || devinfo-
>>>> is_haswell) ?
>>>                                     128 : 16;
>>>    
>>> +   const uint32_t max_images = devinfo->gen < 9 ? MAX_GEN8_IMAGES
>>> : MAX_IMAGES;
>>> +
>>>       VkSampleCountFlags sample_counts =
>>>          isl_device_get_sample_counts(&pdevice->isl_dev);
>>>    
>>> +
>>>       VkPhysicalDeviceLimits limits = {
>>>          .maxImageDimension1D                      = (1 << 14),
>>>          .maxImageDimension2D                      = (1 << 14),
>>> @@ -1009,7 +1012,7 @@ void anv_GetPhysicalDeviceProperties(
>>>          .maxPerStageDescriptorUniformBuffers      = 64,
>>>          .maxPerStageDescriptorStorageBuffers      = 64,
>>>          .maxPerStageDescriptorSampledImages       = max_samplers,
>>> -      .maxPerStageDescriptorStorageImages       = 64,
>>> +      .maxPerStageDescriptorStorageImages       = max_images,
>>>          .maxPerStageDescriptorInputAttachments    = 64,
>>>          .maxPerStageResources                     = 250,
>>>          .maxDescriptorSetSamplers                 = 6 *
>>> max_samplers, /* number of stages * maxPerStageDescriptorSamplers
>>> */
>>> @@ -1018,7 +1021,7 @@ void anv_GetPhysicalDeviceProperties(
>>>          .maxDescriptorSetStorageBuffers           = 6 *
>>> 64,           /* number of stages *
>>> maxPerStageDescriptorStorageBuffers */
>>>          .maxDescriptorSetStorageBuffersDynamic    =
>>> MAX_DYNAMIC_BUFFERS / 2,
>>>          .maxDescriptorSetSampledImages            = 6 *
>>> max_samplers, /* number of stages *
>>> maxPerStageDescriptorSampledImages */
>>> -      .maxDescriptorSetStorageImages            = 6 *
>>> 64,           /* number of stages *
>>> maxPerStageDescriptorStorageImages */
>>> +      .maxDescriptorSetStorageImages            = 6 *
>>> max_images,   /* number of stages *
>>> maxPerStageDescriptorStorageImages */
>>>          .maxDescriptorSetInputAttachments         = 256,
>>>          .maxVertexInputAttributes                 = MAX_VBS,
>>>          .maxVertexInputBindings                   = MAX_VBS,
>>> diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
>>> b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
>>> index b3daf702bc..53de347b3c 100644
>>> --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
>>> +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c
>>> @@ -529,7 +529,8 @@ anv_nir_apply_pipeline_layout(const struct
>>> anv_physical_device *pdevice,
>>>       }
>>>    
>>>       if (map->image_count > 0) {
>>> -      assert(map->image_count <= MAX_IMAGES);
>>> +      assert((pdevice->compiler->devinfo->gen <= 8 && map-
>>>> image_count <= MAX_GEN8_IMAGES) ||
>>> +              map->image_count <= MAX_IMAGES);
>>
>> I'm not sure why it wasn't < instead of <= previously, sounds like
>> it
>> should be <.
> I think <= is fine, map->image_count is not an index but the total
> count so its value should be fine up to the maximum allowed, right?


Oh dear, sorry, you're right.


>
>> Also I don't think this version works, your previous version was okay
>> :
>>
>>
>> image_count < MAX_GEN8_IMAGE || (gen > 8 && image_count < MAX_IMAGES)
> Right, I didn't read Eric's proposal properly, and it would not work
> for gen8. I'll revert the form of the assertion to the previous
> version.
>
>>>          assert(shader->num_uniforms == prog_data->nr_params * 4);
>>>          state.first_image_uniform = shader->num_uniforms;
>>>          uint32_t *param = brw_stage_prog_data_add_params(prog_data,
>>> diff --git a/src/intel/vulkan/anv_private.h
>>> b/src/intel/vulkan/anv_private.h
>>> index 770254e93e..9ddd41b1fa 100644
>>> --- a/src/intel/vulkan/anv_private.h
>>> +++ b/src/intel/vulkan/anv_private.h
>>> @@ -157,7 +157,8 @@ struct gen_l3_config;
>>>    #define MAX_SCISSORS    16
>>>    #define MAX_PUSH_CONSTANTS_SIZE 128
>>>    #define MAX_DYNAMIC_BUFFERS 16
>>> -#define MAX_IMAGES 8
>>> +#define MAX_IMAGES 64
>>> +#define MAX_GEN8_IMAGES 8
>>>    #define MAX_PUSH_DESCRIPTORS 32 /* Minimum requirement */
>>>    
>>>    /* The kernel relocation API has a limitation of a 32-bit delta
>>> value
>>> @@ -1882,7 +1883,6 @@ struct anv_push_constants {
>>>       /* Used for vkCmdDispatchBase */
>>>       uint32_t base_work_group_id[3];
>>>    
>>> -   /* Image data for image_load_store on pre-SKL */
>>>       struct brw_image_param images[MAX_IMAGES];
>>>    };
>>>    
>>
>>
>



More information about the mesa-dev mailing list