[Mesa-dev] [PATCH 4/4] radv: implement VK_AMD_shader_core_properties

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon Apr 9 08:10:55 UTC 2018



On 04/08/2018 12:59 AM, Bas Nieuwenhuizen wrote:
> On Fri, Apr 6, 2018 at 2:28 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> Simple extension that only returns information for AMD hw.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/amd/vulkan/radv_device.c      | 71 +++++++++++++++++++++++++++++++++++++++
>>   src/amd/vulkan/radv_extensions.py |  1 +
>>   2 files changed, 72 insertions(+)
>>
>> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
>> index 41f8242754..fba0b5c586 100644
>> --- a/src/amd/vulkan/radv_device.c
>> +++ b/src/amd/vulkan/radv_device.c
>> @@ -888,6 +888,39 @@ void radv_GetPhysicalDeviceProperties(
>>          memcpy(pProperties->pipelineCacheUUID, pdevice->cache_uuid, VK_UUID_SIZE);
>>   }
>>
>> +static uint32_t
>> +radv_get_max_cu_per_sh(struct radv_physical_device *device)
>> +{
>> +       /* This should be queried from the KMD, like the number of SEs. */
>> +       switch (device->rad_info.family) {
>> +       case CHIP_TAHITI:
>> +               return 8;
>> +       case CHIP_HAINAN:
>> +               return 5;
>> +       case CHIP_BONAIRE:
>> +               return 7;
>> +       case CHIP_HAWAII:
>> +               return 11;
>> +       case CHIP_ICELAND:
>> +               return 6;
>> +       case CHIP_CARRIZO:
>> +               return 8;
>> +       case CHIP_TONGA:
>> +               return 8;
>> +       case CHIP_FIJI:
>> +               return 16;
>> +       case CHIP_STONEY:
>> +               return 3;
>> +       case CHIP_VEGA10:
>> +               return 16;
>> +       case CHIP_RAVEN:
>> +               return 11;
>> +       default:
>> +               fprintf(stderr, "Number of CUs per SH unknown!\n");
>> +               return 0;
>> +       }
>> +}
>> +
>>   void radv_GetPhysicalDeviceProperties2(
>>          VkPhysicalDevice                            physicalDevice,
>>          VkPhysicalDeviceProperties2KHR             *pProperties)
>> @@ -961,6 +994,44 @@ void radv_GetPhysicalDeviceProperties2(
>>                          properties->filterMinmaxSingleComponentFormats = true;
>>                          break;
>>                  }
>> +               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
>> +                       VkPhysicalDeviceShaderCorePropertiesAMD *properties =
>> +                               (VkPhysicalDeviceShaderCorePropertiesAMD *)ext;
>> +
>> +                       /* Shader engines. */
>> +                       properties->shaderEngineCount =
>> +                               pdevice->rad_info.max_se;
>> +                       properties->shaderArraysPerEngineCount =
>> +                               pdevice->rad_info.max_sh_per_se;
>> +                       properties->computeUnitsPerShaderArray =
>> +                               radv_get_max_cu_per_sh(pdevice);
> 
> The kernel provides a num_cu_per_sh variable, I'd prefer if you use that.
> 
>> +                       properties->simdPerComputeUnit = 4;
>> +                       properties->wavefrontsPerSimd =
>> +                               pdevice->rad_info.family == CHIP_TONGA ||
>> +                               pdevice->rad_info.family == CHIP_ICELAND ||
>> +                               pdevice->rad_info.family == CHIP_POLARIS10 ||
>> +                               pdevice->rad_info.family == CHIP_POLARIS11 ||
>> +                               pdevice->rad_info.family == CHIP_POLARIS12 ? 8 : 10;
>> +                       properties->wavefrontSize = 64;
>> +
>> +                       /* SGPR. */
>> +                       properties->sgprsPerSimd =
>> +                               radv_get_num_physical_sgprs(pdevice);
>> +                       properties->minSgprAllocation =
>> +                               pdevice->rad_info.chip_class >= VI ? 16 : 8;
>> +                       properties->maxSgprAllocation =
>> +                               pdevice->rad_info.family == CHIP_TONGA ||
>> +                               pdevice->rad_info.family == CHIP_ICELAND ? 96 : 104;
> 
> Do we want to round this to multiples of 16 for >= VI? What does AMD do here.

AMDVLK uses 104 too.

> 
>> +                       properties->sgprAllocationGranularity =
>> +                               pdevice->rad_info.chip_class >= VI ? 16 : 8;
>> +
>> +                       /* VGPR. */
>> +                       properties->vgprsPerSimd = RADV_NUM_PHYSICAL_VGPRS;
>> +                       properties->minVgprAllocation = 4;
>> +                       properties->maxVgprAllocation = 256;
>> +                       properties->vgprAllocationGranularity = 4;
>> +                       break;
>> +               }
>>                  default:
>>                          break;
>>                  }
>> diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_extensions.py
>> index bc63a34896..a25db637e2 100644
>> --- a/src/amd/vulkan/radv_extensions.py
>> +++ b/src/amd/vulkan/radv_extensions.py
>> @@ -96,6 +96,7 @@ EXTENSIONS = [
>>       Extension('VK_AMD_draw_indirect_count',               1, True),
>>       Extension('VK_AMD_gcn_shader',                        1, True),
>>       Extension('VK_AMD_rasterization_order',               1, 'device->has_out_of_order_rast'),
>> +    Extension('VK_AMD_shader_core_properties',            1, True),
>>       Extension('VK_AMD_shader_info',                       1, True),
>>       Extension('VK_AMD_shader_trinary_minmax',             1, True),
>>   ]
>> --
>> 2.16.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list