radeonsi: report accurate SGPR and VGPR spills
authorMarek Olšák <marek.olsak@amd.com>
Tue, 5 Jul 2016 00:54:43 +0000 (02:54 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 13 Jul 2016 17:46:16 +0000 (19:46 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader.h

index 64fbd74cb443295d9cec38b5112e20535ba6708d..41bcbd4fc3d10531738180b94b25539618edbece 100644 (file)
@@ -5956,6 +5956,12 @@ void si_shader_binary_read_config(struct radeon_shader_binary *binary,
                                conf->scratch_bytes_per_wave =
                                        G_00B860_WAVESIZE(value) * 256 * 4;
                        break;
+               case 0x4: /* SPILLED_SGPRS */
+                       conf->spilled_sgprs = value;
+                       break;
+               case 0x8: /* SPILLED_VGPRS */
+                       conf->spilled_vgprs = value;
+                       break;
                default:
                        {
                                static bool printed;
@@ -6119,8 +6125,6 @@ static void si_shader_dump_stats(struct si_screen *sscreen,
        unsigned lds_increment = sscreen->b.chip_class >= CIK ? 512 : 256;
        unsigned lds_per_wave = 0;
        unsigned max_simd_waves = 10;
-       /* Assuming SGPRs aren't spilled. */
-       unsigned spilled_vgprs = conf->scratch_bytes_per_wave / 64 / 4;
 
        /* Compute LDS usage for PS. */
        if (processor == PIPE_SHADER_FRAGMENT) {
@@ -6167,23 +6171,27 @@ static void si_shader_dump_stats(struct si_screen *sscreen,
                fprintf(file, "*** SHADER STATS ***\n"
                        "SGPRS: %d\n"
                        "VGPRS: %d\n"
+                       "Spilled SGPRs: %d\n"
                        "Spilled VGPRs: %d\n"
                        "Code Size: %d bytes\n"
                        "LDS: %d blocks\n"
                        "Scratch: %d bytes per wave\n"
                        "Max Waves: %d\n"
                        "********************\n",
-                       conf->num_sgprs, conf->num_vgprs, spilled_vgprs, code_size,
+                       conf->num_sgprs, conf->num_vgprs,
+                       conf->spilled_sgprs, conf->spilled_vgprs, code_size,
                        conf->lds_size, conf->scratch_bytes_per_wave,
                        max_simd_waves);
        }
 
        pipe_debug_message(debug, SHADER_INFO,
                           "Shader Stats: SGPRS: %d VGPRS: %d Code Size: %d "
-                          "LDS: %d Scratch: %d Max Waves: %d Spilled VGPRs: %d",
+                          "LDS: %d Scratch: %d Max Waves: %d Spilled SGPRs: %d "
+                          "Spilled VGPRs: %d",
                           conf->num_sgprs, conf->num_vgprs, code_size,
                           conf->lds_size, conf->scratch_bytes_per_wave,
-                          max_simd_waves, spilled_vgprs);
+                          max_simd_waves, conf->spilled_sgprs,
+                          conf->spilled_vgprs);
 }
 
 static const char *si_get_shader_name(struct si_shader *shader,
index 8fc0a36abbcd9dff680f3d90372532da12aff68d..290693165484e5b6186667f693f9a41606910f59 100644 (file)
@@ -397,6 +397,8 @@ union si_shader_key {
 struct si_shader_config {
        unsigned                        num_sgprs;
        unsigned                        num_vgprs;
+       unsigned                        spilled_sgprs;
+       unsigned                        spilled_vgprs;
        unsigned                        lds_size;
        unsigned                        spi_ps_input_ena;
        unsigned                        spi_ps_input_addr;