nir: Print the constant data size associated with a shader.
[mesa.git] / src / compiler / nir / nir_print.c
index 9a03f6eee707f4654e5a3ef9aa69b2440bf7ac0d..7931a88cb20e40da814dfac5f9188ca9b7424432 100644 (file)
@@ -399,6 +399,7 @@ print_constant(nir_constant *c, const struct glsl_type *type, print_state *state
       break;
 
    case GLSL_TYPE_STRUCT:
+   case GLSL_TYPE_INTERFACE:
       for (i = 0; i < c->num_elements; i++) {
          if (i > 0) fprintf(fp, ", ");
          fprintf(fp, "{ ");
@@ -461,8 +462,10 @@ print_var_decl(nir_variable *var, print_state *state)
    const char *const samp = (var->data.sample) ? "sample " : "";
    const char *const patch = (var->data.patch) ? "patch " : "";
    const char *const inv = (var->data.invariant) ? "invariant " : "";
-   fprintf(fp, "%s%s%s%s%s %s ",
-           cent, samp, patch, inv, get_variable_mode_str(var->data.mode, false),
+   const char *const per_view = (var->data.per_view) ? "per_view " : "";
+   fprintf(fp, "%s%s%s%s%s%s %s ",
+           cent, samp, patch, inv, per_view,
+           get_variable_mode_str(var->data.mode, false),
            glsl_interp_mode_name(var->data.interpolation));
 
    enum gl_access_qualifier access = var->data.access;
@@ -475,52 +478,17 @@ print_var_decl(nir_variable *var, print_state *state)
    fprintf(fp, "%s%s%s%s%s%s", coher, volat, restr, ronly, wonly, reorder);
 
    if (glsl_get_base_type(glsl_without_array(var->type)) == GLSL_TYPE_IMAGE) {
-#define FORMAT_CASE(x) case x: fprintf(fp, #x " "); break
-      switch (var->data.image.format) {
-      FORMAT_CASE(GL_RGBA32F);
-      FORMAT_CASE(GL_RGBA32UI);
-      FORMAT_CASE(GL_RGBA32I);
-      FORMAT_CASE(GL_R32F);
-      FORMAT_CASE(GL_R32UI);
-      FORMAT_CASE(GL_R32I);
-      FORMAT_CASE(GL_RG32F);
-      FORMAT_CASE(GL_RG32UI);
-      FORMAT_CASE(GL_RG32I);
-      FORMAT_CASE(GL_R8);
-      FORMAT_CASE(GL_RG8);
-      FORMAT_CASE(GL_RGBA8);
-      FORMAT_CASE(GL_R8_SNORM);
-      FORMAT_CASE(GL_RG8_SNORM);
-      FORMAT_CASE(GL_RGBA8_SNORM);
-      FORMAT_CASE(GL_R16);
-      FORMAT_CASE(GL_RG16);
-      FORMAT_CASE(GL_RGBA16);
-      FORMAT_CASE(GL_R16_SNORM);
-      FORMAT_CASE(GL_RG16_SNORM);
-      FORMAT_CASE(GL_RGBA16_SNORM);
-      FORMAT_CASE(GL_R16F);
-      FORMAT_CASE(GL_RG16F);
-      FORMAT_CASE(GL_RGBA16F);
-      FORMAT_CASE(GL_R8UI);
-      FORMAT_CASE(GL_R8I);
-      FORMAT_CASE(GL_RG8UI);
-      FORMAT_CASE(GL_RG8I);
-      FORMAT_CASE(GL_RGBA8UI);
-      FORMAT_CASE(GL_RGBA8I);
-      FORMAT_CASE(GL_R16UI);
-      FORMAT_CASE(GL_R16I);
-      FORMAT_CASE(GL_RG16UI);
-      FORMAT_CASE(GL_RG16I);
-      FORMAT_CASE(GL_RGBA16UI);
-      FORMAT_CASE(GL_RGBA16I);
-      FORMAT_CASE(GL_R11F_G11F_B10F);
-      FORMAT_CASE(GL_RGB9_E5);
-      FORMAT_CASE(GL_RGB10_A2);
-      FORMAT_CASE(GL_RGB10_A2UI);
-      default: /* Including the normal GL_NONE */
-         break;
-      }
-#undef FORMAT_CASE
+      fprintf(fp, "%s ", util_format_short_name(var->data.image.format));
+   }
+
+   if (var->data.precision) {
+      const char *precisions[] = {
+         "",
+         "highp",
+         "mediump",
+         "lowp",
+      };
+      fprintf(fp, "%s ", precisions[var->data.precision]);
    }
 
    fprintf(fp, "%s %s", glsl_get_type_name(var->type),
@@ -603,6 +571,8 @@ print_var_decl(nir_variable *var, print_state *state)
       print_constant(var->constant_initializer, var->type, state);
       fprintf(fp, " }");
    }
+   if (var->pointer_initializer)
+      fprintf(fp, " = &%s", get_var_name(var->pointer_initializer, state));
 
    fprintf(fp, "\n");
    print_annotation(state, var);
@@ -757,6 +727,26 @@ vulkan_descriptor_type_name(VkDescriptorType type)
    }
 }
 
+static void
+print_alu_type(nir_alu_type type, print_state *state)
+{
+   FILE *fp = state->fp;
+   unsigned size = nir_alu_type_get_type_size(type);
+   const char *name;
+
+   switch (nir_alu_type_get_base_type(type)) {
+   case nir_type_int: name = "int"; break;
+   case nir_type_uint: name = "uint"; break;
+   case nir_type_bool: name = "bool"; break;
+   case nir_type_float: name = "float"; break;
+   default: name = "invalid";
+   }
+   if (size)
+      fprintf(fp, "%s%u", name, size);
+   else
+      fprintf(fp, "%s", name);
+}
+
 static void
 print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
 {
@@ -817,6 +807,7 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
       [NIR_INTRINSIC_MEMORY_SEMANTICS] = "mem_semantics",
       [NIR_INTRINSIC_MEMORY_MODES] = "mem_modes",
       [NIR_INTRINSIC_MEMORY_SCOPE] = "mem_scope",
+      [NIR_INTRINSIC_EXECUTION_SCOPE] = "exec_scope",
    };
    for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) {
       if (!info->index_map[idx])
@@ -870,20 +861,8 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
       }
 
       case NIR_INTRINSIC_TYPE: {
-         nir_alu_type type = nir_intrinsic_type(instr);
-         unsigned size = nir_alu_type_get_type_size(type);
-         const char *name;
-         switch (nir_alu_type_get_base_type(type)) {
-         case nir_type_int: name = "int"; break;
-         case nir_type_uint: name = "uint"; break;
-         case nir_type_bool: name = "bool"; break;
-         case nir_type_float: name = "float"; break;
-         default: name = "invalid";
-         }
-         if (size)
-            fprintf(fp, " type=%s%u", name, size);
-         else
-            fprintf(fp, " type=%s", name);
+         fprintf(fp, " type=");
+         print_alu_type(nir_intrinsic_type(instr), state);
          break;
       }
 
@@ -927,9 +906,14 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
          break;
       }
 
+      case NIR_INTRINSIC_EXECUTION_SCOPE:
       case NIR_INTRINSIC_MEMORY_SCOPE: {
-         fprintf(fp, " mem_scope=");
-         switch (nir_intrinsic_memory_scope(instr)) {
+         fprintf(fp, " %s=", index_name[idx]);
+         nir_scope scope =
+            idx == NIR_INTRINSIC_MEMORY_SCOPE ? nir_intrinsic_memory_scope(instr)
+                                              : nir_intrinsic_execution_scope(instr);
+         switch (scope) {
+         case NIR_SCOPE_NONE:         fprintf(fp, "NONE");         break;
          case NIR_SCOPE_DEVICE:       fprintf(fp, "DEVICE");       break;
          case NIR_SCOPE_QUEUE_FAMILY: fprintf(fp, "QUEUE_FAMILY"); break;
          case NIR_SCOPE_WORKGROUP:    fprintf(fp, "WORKGROUP");    break;
@@ -952,27 +936,26 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
    if (!state->shader)
       return;
 
-   struct exec_list *var_list = NULL;
-
+   nir_variable_mode var_mode;
    switch (instr->intrinsic) {
    case nir_intrinsic_load_uniform:
-      var_list = &state->shader->uniforms;
+      var_mode = nir_var_uniform;
       break;
    case nir_intrinsic_load_input:
    case nir_intrinsic_load_interpolated_input:
    case nir_intrinsic_load_per_vertex_input:
-      var_list = &state->shader->inputs;
+      var_mode = nir_var_shader_in;
       break;
    case nir_intrinsic_load_output:
    case nir_intrinsic_store_output:
    case nir_intrinsic_store_per_vertex_output:
-      var_list = &state->shader->outputs;
+      var_mode = nir_var_shader_out;
       break;
    default:
       return;
    }
 
-   nir_foreach_variable(var, var_list) {
+   nir_foreach_variable_with_modes(var, state->shader, var_mode) {
       if ((var->data.driver_location == nir_intrinsic_base(instr)) &&
           (instr->intrinsic == nir_intrinsic_load_uniform ||
            (nir_intrinsic_component(instr) >= var->data.location_frac  &&
@@ -992,7 +975,9 @@ print_tex_instr(nir_tex_instr *instr, print_state *state)
 
    print_dest(&instr->dest, state);
 
-   fprintf(fp, " = ");
+   fprintf(fp, " = (");
+   print_alu_type(instr->dest_type, state);
+   fprintf(fp, ")");
 
    switch (instr->op) {
    case nir_texop_tex:
@@ -1445,7 +1430,7 @@ print_function_impl(nir_function_impl *impl, print_state *state)
 
    fprintf(fp, "{\n");
 
-   nir_foreach_variable(var, &impl->locals) {
+   nir_foreach_function_temp_variable(var, impl) {
       fprintf(fp, "\t");
       print_var_decl(var, state);
    }
@@ -1486,7 +1471,7 @@ init_print_state(print_state *state, nir_shader *shader, FILE *fp)
    state->fp = fp;
    state->shader = shader;
    state->ht = _mesa_pointer_hash_table_create(NULL);
-   state->syms = _mesa_set_create(NULL, _mesa_key_hash_string,
+   state->syms = _mesa_set_create(NULL, _mesa_hash_string,
                                   _mesa_key_string_equal);
    state->index = 0;
 }
@@ -1527,33 +1512,16 @@ nir_print_shader_annotated(nir_shader *shader, FILE *fp,
    fprintf(fp, "inputs: %u\n", shader->num_inputs);
    fprintf(fp, "outputs: %u\n", shader->num_outputs);
    fprintf(fp, "uniforms: %u\n", shader->num_uniforms);
+   if (shader->info.num_ubos)
+      fprintf(fp, "ubos: %u\n", shader->info.num_ubos);
    fprintf(fp, "shared: %u\n", shader->num_shared);
    if (shader->scratch_size)
       fprintf(fp, "scratch: %u\n", shader->scratch_size);
+   if (shader->constant_data_size)
+      fprintf(fp, "constants: %u\n", shader->constant_data_size);
 
-   nir_foreach_variable(var, &shader->uniforms) {
-      print_var_decl(var, &state);
-   }
-
-   nir_foreach_variable(var, &shader->inputs) {
-      print_var_decl(var, &state);
-   }
-
-   nir_foreach_variable(var, &shader->outputs) {
-      print_var_decl(var, &state);
-   }
-
-   nir_foreach_variable(var, &shader->shared) {
+   nir_foreach_variable_in_shader(var, shader)
       print_var_decl(var, &state);
-   }
-
-   nir_foreach_variable(var, &shader->globals) {
-      print_var_decl(var, &state);
-   }
-
-   nir_foreach_variable(var, &shader->system_values) {
-      print_var_decl(var, &state);
-   }
 
    foreach_list_typed(nir_function, func, node, &shader->functions) {
       print_function(func, &state);