tgsi/scan: get information about indirect CONST access
authorMarek Olšák <marek.olsak@amd.com>
Wed, 19 Oct 2016 22:56:08 +0000 (00:56 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 24 Oct 2016 19:41:26 +0000 (21:41 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/tgsi/tgsi_scan.c
src/gallium/auxiliary/tgsi/tgsi_scan.h

index b86207883e12d907a84aa633e22db3968a0e8428..0c810053fe5a3581c30410753fd109ae6452426d 100644 (file)
@@ -271,6 +271,18 @@ scan_instruction(struct tgsi_shader_info *info,
       if (src->Register.Indirect) {
          info->indirect_files |= (1 << src->Register.File);
          info->indirect_files_read |= (1 << src->Register.File);
+
+         /* record indirect constant buffer indexing */
+         if (src->Register.File == TGSI_FILE_CONSTANT) {
+            if (src->Register.Dimension) {
+               if (src->Dimension.Indirect)
+                  info->const_buffers_indirect = info->const_buffers_declared;
+               else
+                  info->const_buffers_indirect |= 1u << src->Dimension.Index;
+            } else {
+               info->const_buffers_indirect |= 1;
+            }
+         }
       }
 
       /* Texture samplers */
@@ -392,6 +404,7 @@ scan_declaration(struct tgsi_shader_info *info,
 
          info->const_file_max[buffer] =
             MAX2(info->const_file_max[buffer], (int)reg);
+         info->const_buffers_declared |= 1u << buffer;
       }
       else if (file == TGSI_FILE_INPUT) {
          info->input_semantic_name[reg] = (ubyte) semName;
index 0c5f2ba064ace0af35038dda69d77d0b8a33e0dc..2e61dc76842dcf9cd05b0150ad1bec5d40da0d45 100644 (file)
@@ -64,6 +64,7 @@ struct tgsi_shader_info
    uint file_count[TGSI_FILE_COUNT];  /**< number of declared registers */
    int file_max[TGSI_FILE_COUNT];  /**< highest index of declared registers */
    int const_file_max[PIPE_MAX_CONSTANT_BUFFERS];
+   unsigned const_buffers_declared; /**< bitmask of declared const buffers */
    unsigned samplers_declared; /**< bitmask of declared samplers */
    ubyte sampler_targets[PIPE_MAX_SHADER_SAMPLER_VIEWS];  /**< TGSI_TEXTURE_x values */
    ubyte sampler_type[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /**< TGSI_RETURN_TYPE_x */
@@ -141,6 +142,7 @@ struct tgsi_shader_info
     */
    unsigned indirect_files_read;
    unsigned indirect_files_written;
+   unsigned const_buffers_indirect; /**< const buffers using indirect addressing */
 
    unsigned properties[TGSI_PROPERTY_COUNT]; /* index with TGSI_PROPERTY_ */