blob: 81a084d71a7731a37c513000752011b1b2ffef17 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
//
//
#include "vk_shader_info_amd.h"
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
//
//
//
void
vk_shader_info_amd_statistics(VkDevice device,
VkPipeline p[],
char const * const names[],
uint32_t const count)
{
#ifndef VK_SHADER_INFO_AMD_STATISTICS_DISABLE
PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD =
(PFN_vkGetShaderInfoAMD)vkGetDeviceProcAddr(device, "vkGetShaderInfoAMD");
if (vkGetShaderInfoAMD == NULL)
return;
fprintf(stdout,
" PHY PHY AVAIL AVAIL\n"
"VGPRs SGPRs LDS_MAX LDS/WG SPILL VGPRs SGPRs VGPRs SGPRs WORKGROUP_SIZE NAME\n");
for (uint32_t ii = 0; ii < count; ii++)
{
VkShaderStatisticsInfoAMD ssi_amd;
size_t ssi_amd_size = sizeof(ssi_amd);
if (vkGetShaderInfoAMD(device,
p[ii],
VK_SHADER_STAGE_COMPUTE_BIT,
VK_SHADER_INFO_TYPE_STATISTICS_AMD,
&ssi_amd_size,
&ssi_amd) == VK_SUCCESS)
{
fprintf(stdout,
"%5" PRIu32 " "
"%5" PRIu32 " "
"%5" PRIu32 " "
"%6zu "
"%6zu "
"%5" PRIu32 " "
"%5" PRIu32 " "
"%5" PRIu32 " "
"%5" PRIu32 " "
"( %6" PRIu32 ", "
"%6" PRIu32 ", "
"%6" PRIu32 " ) ",
ssi_amd.resourceUsage.numUsedVgprs,
ssi_amd.resourceUsage.numUsedSgprs,
ssi_amd.resourceUsage.ldsSizePerLocalWorkGroup,
ssi_amd.resourceUsage.ldsUsageSizeInBytes, // size_t
ssi_amd.resourceUsage.scratchMemUsageInBytes, // size_t
ssi_amd.numPhysicalVgprs,
ssi_amd.numPhysicalSgprs,
ssi_amd.numAvailableVgprs,
ssi_amd.numAvailableSgprs,
ssi_amd.computeWorkGroupSize[0],
ssi_amd.computeWorkGroupSize[1],
ssi_amd.computeWorkGroupSize[2]);
if (names != NULL)
fprintf(stdout, "%s\n", names[ii]);
else
fprintf(stdout, "---\n");
}
}
#endif
}
//
//
//
void
vk_shader_info_amd_disassembly(VkDevice device,
VkPipeline p[],
char const * const names[],
uint32_t const count)
{
#ifndef VK_SHADER_INFO_AMD_DISASSEMBLY_DISABLE
PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD =
(PFN_vkGetShaderInfoAMD)vkGetDeviceProcAddr(device, "vkGetShaderInfoAMD");
if (vkGetShaderInfoAMD == NULL)
return;
for (uint32_t ii = 0; ii < count; ii++)
{
size_t disassembly_amd_size;
if (vkGetShaderInfoAMD(device,
p[ii],
VK_SHADER_STAGE_COMPUTE_BIT,
VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD,
&disassembly_amd_size,
NULL) == VK_SUCCESS)
{
void * disassembly_amd = malloc(disassembly_amd_size);
if (vkGetShaderInfoAMD(device,
p[ii],
VK_SHADER_STAGE_COMPUTE_BIT,
VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD,
&disassembly_amd_size,
disassembly_amd) == VK_SUCCESS)
{
if (names != NULL)
fprintf(stdout, "SHADER: %s\n", names[ii]);
fprintf(stdout, "%s", (char *)disassembly_amd);
}
free(disassembly_amd);
}
}
#endif
}
//
//
//