intel: Add a INTEL_DEBUG=color option.
[mesa.git] / src / intel / tools / decoder.h
index b46e451652fe63176d43f351939f5899f7e6f577..4352dea9679b66f3dd20a973b99ffc83d02b6810 100644 (file)
  * IN THE SOFTWARE.
  */
 
-#pragma once
+#ifndef DECODER_H
+#define DECODER_H
 
 #include <stdint.h>
 #include <stdbool.h>
 
+#include "common/gen_device_info.h"
+
 struct gen_spec;
 struct gen_group;
 struct gen_field;
@@ -36,22 +39,30 @@ static inline uint32_t gen_make_gen(uint32_t major, uint32_t minor)
 }
 
 struct gen_group *gen_spec_find_struct(struct gen_spec *spec, const char *name);
-struct gen_spec *gen_spec_load(const char *filename);
+struct gen_spec *gen_spec_load(const struct gen_device_info *devinfo);
+struct gen_spec *gen_spec_load_from_path(const struct gen_device_info *devinfo,
+                                         const char *path);
 uint32_t gen_spec_get_gen(struct gen_spec *spec);
 struct gen_group *gen_spec_find_instruction(struct gen_spec *spec, const uint32_t *p);
+struct gen_group *gen_spec_find_register(struct gen_spec *spec, uint32_t offset);
 int gen_group_get_length(struct gen_group *group, const uint32_t *p);
 const char *gen_group_get_name(struct gen_group *group);
 uint32_t gen_group_get_opcode(struct gen_group *group);
+struct gen_enum *gen_spec_find_enum(struct gen_spec *spec, const char *name);
 
 struct gen_field_iterator {
    struct gen_group *group;
    const char *name;
    char value[128];
-   uint32_t *p;
+   struct gen_group *struct_desc;
+   const uint32_t *p;
+   int dword; /**< current field starts at &p[dword] */
    int i;
+   bool print_colors;
 };
 
 struct gen_group {
+   struct gen_spec *spec;
    char *name;
    int nfields;
    struct gen_field **fields;
@@ -59,6 +70,20 @@ struct gen_group {
 
    uint32_t opcode_mask;
    uint32_t opcode;
+
+   /* Register specific */
+   uint32_t register_offset;
+};
+
+struct gen_value {
+   char *name;
+   uint64_t value;
+};
+
+struct gen_enum {
+   char *name;
+   int nvalues;
+   struct gen_value **values;
 };
 
 struct gen_type {
@@ -73,14 +98,19 @@ struct gen_type {
       GEN_TYPE_STRUCT,
       GEN_TYPE_UFIXED,
       GEN_TYPE_SFIXED,
-      GEN_TYPE_MBO
+      GEN_TYPE_MBO,
+      GEN_TYPE_ENUM
    } kind;
 
    /* Struct definition for  GEN_TYPE_STRUCT */
-   struct gen_group *gen_struct;
-
-   /* Integer and fractional sizes for GEN_TYPE_UFIXED and GEN_TYPE_SFIXED */
-   int i, f;
+   union {
+      struct gen_group *gen_struct;
+      struct gen_enum *gen_enum;
+      struct {
+         /* Integer and fractional sizes for GEN_TYPE_UFIXED and GEN_TYPE_SFIXED */
+         int i, f;
+      };
+   };
 };
 
 struct gen_field {
@@ -89,9 +119,20 @@ struct gen_field {
    struct gen_type type;
    bool has_default;
    uint32_t default_value;
+
+   struct gen_enum inline_enum;
 };
 
 void gen_field_iterator_init(struct gen_field_iterator *iter,
-                             struct gen_group *group, const uint32_t *p);
+                             struct gen_group *group,
+                             const uint32_t *p,
+                             bool print_colors);
 
 bool gen_field_iterator_next(struct gen_field_iterator *iter);
+
+void gen_print_group(FILE *out,
+                     struct gen_group *group,
+                     uint64_t offset, const uint32_t *p,
+                     int starting_dword, bool color);
+
+#endif /* DECODER_H */