iris: Make iris_has_color_unresolved more generic
[mesa.git] / src / gallium / drivers / radeonsi / si_query.h
index c61af51d57c0d026fac2cd9d59d94ca3cd972c89..1eaa3b255a612cdd799351a3a764bfef09ad12ca 100644 (file)
@@ -38,221 +38,222 @@ struct si_query_buffer;
 struct si_query_hw;
 struct si_resource;
 
-enum {
-       SI_QUERY_DRAW_CALLS = PIPE_QUERY_DRIVER_SPECIFIC,
-       SI_QUERY_DECOMPRESS_CALLS,
-       SI_QUERY_MRT_DRAW_CALLS,
-       SI_QUERY_PRIM_RESTART_CALLS,
-       SI_QUERY_SPILL_DRAW_CALLS,
-       SI_QUERY_COMPUTE_CALLS,
-       SI_QUERY_SPILL_COMPUTE_CALLS,
-       SI_QUERY_DMA_CALLS,
-       SI_QUERY_CP_DMA_CALLS,
-       SI_QUERY_NUM_VS_FLUSHES,
-       SI_QUERY_NUM_PS_FLUSHES,
-       SI_QUERY_NUM_CS_FLUSHES,
-       SI_QUERY_NUM_CB_CACHE_FLUSHES,
-       SI_QUERY_NUM_DB_CACHE_FLUSHES,
-       SI_QUERY_NUM_L2_INVALIDATES,
-       SI_QUERY_NUM_L2_WRITEBACKS,
-       SI_QUERY_NUM_RESIDENT_HANDLES,
-       SI_QUERY_TC_OFFLOADED_SLOTS,
-       SI_QUERY_TC_DIRECT_SLOTS,
-       SI_QUERY_TC_NUM_SYNCS,
-       SI_QUERY_CS_THREAD_BUSY,
-       SI_QUERY_GALLIUM_THREAD_BUSY,
-       SI_QUERY_REQUESTED_VRAM,
-       SI_QUERY_REQUESTED_GTT,
-       SI_QUERY_MAPPED_VRAM,
-       SI_QUERY_MAPPED_GTT,
-       SI_QUERY_BUFFER_WAIT_TIME,
-       SI_QUERY_NUM_MAPPED_BUFFERS,
-       SI_QUERY_NUM_GFX_IBS,
-       SI_QUERY_NUM_SDMA_IBS,
-       SI_QUERY_GFX_BO_LIST_SIZE,
-       SI_QUERY_GFX_IB_SIZE,
-       SI_QUERY_NUM_BYTES_MOVED,
-       SI_QUERY_NUM_EVICTIONS,
-       SI_QUERY_NUM_VRAM_CPU_PAGE_FAULTS,
-       SI_QUERY_VRAM_USAGE,
-       SI_QUERY_VRAM_VIS_USAGE,
-       SI_QUERY_GTT_USAGE,
-       SI_QUERY_GPU_TEMPERATURE,
-       SI_QUERY_CURRENT_GPU_SCLK,
-       SI_QUERY_CURRENT_GPU_MCLK,
-       SI_QUERY_GPU_LOAD,
-       SI_QUERY_GPU_SHADERS_BUSY,
-       SI_QUERY_GPU_TA_BUSY,
-       SI_QUERY_GPU_GDS_BUSY,
-       SI_QUERY_GPU_VGT_BUSY,
-       SI_QUERY_GPU_IA_BUSY,
-       SI_QUERY_GPU_SX_BUSY,
-       SI_QUERY_GPU_WD_BUSY,
-       SI_QUERY_GPU_BCI_BUSY,
-       SI_QUERY_GPU_SC_BUSY,
-       SI_QUERY_GPU_PA_BUSY,
-       SI_QUERY_GPU_DB_BUSY,
-       SI_QUERY_GPU_CP_BUSY,
-       SI_QUERY_GPU_CB_BUSY,
-       SI_QUERY_GPU_SDMA_BUSY,
-       SI_QUERY_GPU_PFP_BUSY,
-       SI_QUERY_GPU_MEQ_BUSY,
-       SI_QUERY_GPU_ME_BUSY,
-       SI_QUERY_GPU_SURF_SYNC_BUSY,
-       SI_QUERY_GPU_CP_DMA_BUSY,
-       SI_QUERY_GPU_SCRATCH_RAM_BUSY,
-       SI_QUERY_NUM_COMPILATIONS,
-       SI_QUERY_NUM_SHADERS_CREATED,
-       SI_QUERY_BACK_BUFFER_PS_DRAW_RATIO,
-       SI_QUERY_NUM_SHADER_CACHE_HITS,
-       SI_QUERY_GPIN_ASIC_ID,
-       SI_QUERY_GPIN_NUM_SIMD,
-       SI_QUERY_GPIN_NUM_RB,
-       SI_QUERY_GPIN_NUM_SPI,
-       SI_QUERY_GPIN_NUM_SE,
-       SI_QUERY_TIME_ELAPSED_SDMA,
-       SI_QUERY_TIME_ELAPSED_SDMA_SI, /* emulated, measured on the CPU */
+#define SI_MAX_STREAMS 4
 
-       SI_QUERY_FIRST_PERFCOUNTER = PIPE_QUERY_DRIVER_SPECIFIC + 100,
+enum
+{
+   SI_QUERY_DRAW_CALLS = PIPE_QUERY_DRIVER_SPECIFIC,
+   SI_QUERY_DECOMPRESS_CALLS,
+   SI_QUERY_MRT_DRAW_CALLS,
+   SI_QUERY_PRIM_RESTART_CALLS,
+   SI_QUERY_SPILL_DRAW_CALLS,
+   SI_QUERY_COMPUTE_CALLS,
+   SI_QUERY_SPILL_COMPUTE_CALLS,
+   SI_QUERY_DMA_CALLS,
+   SI_QUERY_CP_DMA_CALLS,
+   SI_QUERY_NUM_VS_FLUSHES,
+   SI_QUERY_NUM_PS_FLUSHES,
+   SI_QUERY_NUM_CS_FLUSHES,
+   SI_QUERY_NUM_CB_CACHE_FLUSHES,
+   SI_QUERY_NUM_DB_CACHE_FLUSHES,
+   SI_QUERY_NUM_L2_INVALIDATES,
+   SI_QUERY_NUM_L2_WRITEBACKS,
+   SI_QUERY_NUM_RESIDENT_HANDLES,
+   SI_QUERY_TC_OFFLOADED_SLOTS,
+   SI_QUERY_TC_DIRECT_SLOTS,
+   SI_QUERY_TC_NUM_SYNCS,
+   SI_QUERY_CS_THREAD_BUSY,
+   SI_QUERY_GALLIUM_THREAD_BUSY,
+   SI_QUERY_REQUESTED_VRAM,
+   SI_QUERY_REQUESTED_GTT,
+   SI_QUERY_MAPPED_VRAM,
+   SI_QUERY_MAPPED_GTT,
+   SI_QUERY_BUFFER_WAIT_TIME,
+   SI_QUERY_NUM_MAPPED_BUFFERS,
+   SI_QUERY_NUM_GFX_IBS,
+   SI_QUERY_NUM_SDMA_IBS,
+   SI_QUERY_GFX_BO_LIST_SIZE,
+   SI_QUERY_GFX_IB_SIZE,
+   SI_QUERY_NUM_BYTES_MOVED,
+   SI_QUERY_NUM_EVICTIONS,
+   SI_QUERY_NUM_VRAM_CPU_PAGE_FAULTS,
+   SI_QUERY_VRAM_USAGE,
+   SI_QUERY_VRAM_VIS_USAGE,
+   SI_QUERY_GTT_USAGE,
+   SI_QUERY_GPU_TEMPERATURE,
+   SI_QUERY_CURRENT_GPU_SCLK,
+   SI_QUERY_CURRENT_GPU_MCLK,
+   SI_QUERY_GPU_LOAD,
+   SI_QUERY_GPU_SHADERS_BUSY,
+   SI_QUERY_GPU_TA_BUSY,
+   SI_QUERY_GPU_GDS_BUSY,
+   SI_QUERY_GPU_VGT_BUSY,
+   SI_QUERY_GPU_IA_BUSY,
+   SI_QUERY_GPU_SX_BUSY,
+   SI_QUERY_GPU_WD_BUSY,
+   SI_QUERY_GPU_BCI_BUSY,
+   SI_QUERY_GPU_SC_BUSY,
+   SI_QUERY_GPU_PA_BUSY,
+   SI_QUERY_GPU_DB_BUSY,
+   SI_QUERY_GPU_CP_BUSY,
+   SI_QUERY_GPU_CB_BUSY,
+   SI_QUERY_GPU_SDMA_BUSY,
+   SI_QUERY_GPU_PFP_BUSY,
+   SI_QUERY_GPU_MEQ_BUSY,
+   SI_QUERY_GPU_ME_BUSY,
+   SI_QUERY_GPU_SURF_SYNC_BUSY,
+   SI_QUERY_GPU_CP_DMA_BUSY,
+   SI_QUERY_GPU_SCRATCH_RAM_BUSY,
+   SI_QUERY_NUM_COMPILATIONS,
+   SI_QUERY_NUM_SHADERS_CREATED,
+   SI_QUERY_BACK_BUFFER_PS_DRAW_RATIO,
+   SI_QUERY_GPIN_ASIC_ID,
+   SI_QUERY_GPIN_NUM_SIMD,
+   SI_QUERY_GPIN_NUM_RB,
+   SI_QUERY_GPIN_NUM_SPI,
+   SI_QUERY_GPIN_NUM_SE,
+   SI_QUERY_TIME_ELAPSED_SDMA,
+   SI_QUERY_TIME_ELAPSED_SDMA_SI, /* emulated, measured on the CPU */
+   SI_QUERY_PD_NUM_PRIMS_ACCEPTED,
+   SI_QUERY_PD_NUM_PRIMS_REJECTED,
+   SI_QUERY_PD_NUM_PRIMS_INELIGIBLE,
+   SI_QUERY_LIVE_SHADER_CACHE_HITS,
+   SI_QUERY_LIVE_SHADER_CACHE_MISSES,
+   SI_QUERY_MEMORY_SHADER_CACHE_HITS,
+   SI_QUERY_MEMORY_SHADER_CACHE_MISSES,
+   SI_QUERY_DISK_SHADER_CACHE_HITS,
+   SI_QUERY_DISK_SHADER_CACHE_MISSES,
+
+   SI_QUERY_FIRST_PERFCOUNTER = PIPE_QUERY_DRIVER_SPECIFIC + 100,
 };
 
-enum {
-       SI_QUERY_GROUP_GPIN = 0,
-       SI_NUM_SW_QUERY_GROUPS
+enum
+{
+   SI_QUERY_GROUP_GPIN = 0,
+   SI_NUM_SW_QUERY_GROUPS
 };
 
 struct si_query_ops {
-       void (*destroy)(struct si_screen *, struct si_query *);
-       bool (*begin)(struct si_context *, struct si_query *);
-       bool (*end)(struct si_context *, struct si_query *);
-       bool (*get_result)(struct si_context *,
-                          struct si_query *, bool wait,
-                          union pipe_query_result *result);
-       void (*get_result_resource)(struct si_context *,
-                                   struct si_query *, bool wait,
-                                   enum pipe_query_value_type result_type,
-                                   int index,
-                                   struct pipe_resource *resource,
-                                   unsigned offset);
+   void (*destroy)(struct si_context *, struct si_query *);
+   bool (*begin)(struct si_context *, struct si_query *);
+   bool (*end)(struct si_context *, struct si_query *);
+   bool (*get_result)(struct si_context *, struct si_query *, bool wait,
+                      union pipe_query_result *result);
+   void (*get_result_resource)(struct si_context *, struct si_query *, bool wait,
+                               enum pipe_query_value_type result_type, int index,
+                               struct pipe_resource *resource, unsigned offset);
 
-       void (*suspend)(struct si_context *, struct si_query *);
-       void (*resume)(struct si_context *, struct si_query *);
+   void (*suspend)(struct si_context *, struct si_query *);
+   void (*resume)(struct si_context *, struct si_query *);
 };
 
 struct si_query {
-       struct threaded_query b;
-       const struct si_query_ops *ops;
+   struct threaded_query b;
+   const struct si_query_ops *ops;
 
-       /* The PIPE_QUERY_xxx type of query */
-       unsigned type;
+   /* The PIPE_QUERY_xxx type of query */
+   unsigned type;
 
-       /* The number of dwords for suspend. */
-       unsigned num_cs_dw_suspend;
+   /* The number of dwords for suspend. */
+   unsigned num_cs_dw_suspend;
 
-       /* Linked list of queries that must be suspended at end of CS. */
-       struct list_head active_list;
+   /* Linked list of queries that must be suspended at end of CS. */
+   struct list_head active_list;
 };
 
-enum {
-       SI_QUERY_HW_FLAG_NO_START = (1 << 0),
-       /* gap */
-       /* whether begin_query doesn't clear the result */
-       SI_QUERY_HW_FLAG_BEGIN_RESUMES = (1 << 2),
+enum
+{
+   SI_QUERY_HW_FLAG_NO_START = (1 << 0),
+   /* gap */
+   /* whether begin_query doesn't clear the result */
+   SI_QUERY_HW_FLAG_BEGIN_RESUMES = (1 << 2),
 };
 
 struct si_query_hw_ops {
-       bool (*prepare_buffer)(struct si_context *, struct si_query_buffer *);
-       void (*emit_start)(struct si_context *,
-                          struct si_query_hw *,
-                          struct si_resource *buffer, uint64_t va);
-       void (*emit_stop)(struct si_context *,
-                         struct si_query_hw *,
-                         struct si_resource *buffer, uint64_t va);
-       void (*clear_result)(struct si_query_hw *, union pipe_query_result *);
-       void (*add_result)(struct si_screen *screen,
-                          struct si_query_hw *, void *buffer,
-                          union pipe_query_result *result);
+   bool (*prepare_buffer)(struct si_context *, struct si_query_buffer *);
+   void (*emit_start)(struct si_context *, struct si_query_hw *, struct si_resource *buffer,
+                      uint64_t va);
+   void (*emit_stop)(struct si_context *, struct si_query_hw *, struct si_resource *buffer,
+                     uint64_t va);
+   void (*clear_result)(struct si_query_hw *, union pipe_query_result *);
+   void (*add_result)(struct si_screen *screen, struct si_query_hw *, void *buffer,
+                      union pipe_query_result *result);
 };
 
 struct si_query_buffer {
-       /* The buffer where query results are stored. */
-       struct si_resource              *buf;
-       /* If a query buffer is full, a new buffer is created and the old one
-        * is put in here. When we calculate the result, we sum up the samples
-        * from all buffers. */
-       struct si_query_buffer  *previous;
-       /* Offset of the next free result after current query data */
-       unsigned                        results_end;
-       bool unprepared;
+   /* The buffer where query results are stored. */
+   struct si_resource *buf;
+   /* If a query buffer is full, a new buffer is created and the old one
+    * is put in here. When we calculate the result, we sum up the samples
+    * from all buffers. */
+   struct si_query_buffer *previous;
+   /* Offset of the next free result after current query data */
+   unsigned results_end;
+   bool unprepared;
 };
 
 void si_query_buffer_destroy(struct si_screen *sctx, struct si_query_buffer *buffer);
 void si_query_buffer_reset(struct si_context *sctx, struct si_query_buffer *buffer);
 bool si_query_buffer_alloc(struct si_context *sctx, struct si_query_buffer *buffer,
-                          bool (*prepare_buffer)(struct si_context *, struct si_query_buffer*),
-                          unsigned size);
-
+                           bool (*prepare_buffer)(struct si_context *, struct si_query_buffer *),
+                           unsigned size);
 
 struct si_query_hw {
-       struct si_query b;
-       struct si_query_hw_ops *ops;
-       unsigned flags;
+   struct si_query b;
+   struct si_query_hw_ops *ops;
+   unsigned flags;
 
-       /* The query buffer and how many results are in it. */
-       struct si_query_buffer buffer;
-       /* Size of the result in memory for both begin_query and end_query,
-        * this can be one or two numbers, or it could even be a size of a structure. */
-       unsigned result_size;
-       /* For transform feedback: which stream the query is for */
-       unsigned stream;
+   /* The query buffer and how many results are in it. */
+   struct si_query_buffer buffer;
+   /* Size of the result in memory for both begin_query and end_query,
+    * this can be one or two numbers, or it could even be a size of a structure. */
+   unsigned result_size;
+   /* For transform feedback: which stream the query is for */
+   unsigned stream;
 
-       /* Workaround via compute shader */
-       struct si_resource *workaround_buf;
-       unsigned workaround_offset;
+   /* Workaround via compute shader */
+   struct si_resource *workaround_buf;
+   unsigned workaround_offset;
 };
 
-void si_query_hw_destroy(struct si_screen *sscreen,
-                        struct si_query *squery);
-bool si_query_hw_begin(struct si_context *sctx,
-                      struct si_query *squery);
-bool si_query_hw_end(struct si_context *sctx,
-                    struct si_query *squery);
-bool si_query_hw_get_result(struct si_context *sctx,
-                           struct si_query *squery,
-                           bool wait,
-                           union pipe_query_result *result);
+void si_query_hw_destroy(struct si_context *sctx, struct si_query *squery);
+bool si_query_hw_begin(struct si_context *sctx, struct si_query *squery);
+bool si_query_hw_end(struct si_context *sctx, struct si_query *squery);
+bool si_query_hw_get_result(struct si_context *sctx, struct si_query *squery, bool wait,
+                            union pipe_query_result *result);
 void si_query_hw_suspend(struct si_context *sctx, struct si_query *query);
 void si_query_hw_resume(struct si_context *sctx, struct si_query *query);
 
+/* Shader-based queries */
+struct pipe_query *gfx10_sh_query_create(struct si_screen *screen, enum pipe_query_type query_type,
+                                         unsigned index);
 
 /* Performance counters */
 struct si_perfcounters {
-       unsigned num_groups;
-       unsigned num_blocks;
-       struct si_pc_block *blocks;
+   unsigned num_groups;
+   unsigned num_blocks;
+   struct si_pc_block *blocks;
 
-       unsigned num_stop_cs_dwords;
-       unsigned num_instance_cs_dwords;
+   unsigned num_stop_cs_dwords;
+   unsigned num_instance_cs_dwords;
 
-       bool separate_se;
-       bool separate_instance;
+   bool separate_se;
+   bool separate_instance;
 };
 
-struct pipe_query *si_create_batch_query(struct pipe_context *ctx,
-                                        unsigned num_queries,
-                                        unsigned *query_types);
+struct pipe_query *si_create_batch_query(struct pipe_context *ctx, unsigned num_queries,
+                                         unsigned *query_types);
 
-int si_get_perfcounter_info(struct si_screen *,
-                           unsigned index,
-                           struct pipe_driver_query_info *info);
-int si_get_perfcounter_group_info(struct si_screen *,
-                                 unsigned index,
-                                 struct pipe_driver_query_group_info *info);
+int si_get_perfcounter_info(struct si_screen *, unsigned index,
+                            struct pipe_driver_query_info *info);
+int si_get_perfcounter_group_info(struct si_screen *, unsigned index,
+                                  struct pipe_driver_query_group_info *info);
 
 struct si_qbo_state {
-       void *saved_compute;
-       struct pipe_constant_buffer saved_const0;
-       struct pipe_shader_buffer saved_ssbo[3];
+   void *saved_compute;
+   struct pipe_constant_buffer saved_const0;
+   struct pipe_shader_buffer saved_ssbo[3];
+   unsigned saved_ssbo_writable_mask;
 };
 
 #endif /* SI_QUERY_H */