1/* 2 * Copyright (C) 2013 Rob Clark <robclark@freedesktop.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Rob Clark <robclark@freedesktop.org> 25 */ 26 27#ifndef FREEDRENO_QUERY_H_ 28#define FREEDRENO_QUERY_H_ 29 30#include "pipe/p_context.h" 31 32struct fd_context; 33struct fd_query; 34 35struct fd_query_funcs { 36 void (*destroy_query)(struct fd_context *ctx, 37 struct fd_query *q); 38 boolean (*begin_query)(struct fd_context *ctx, struct fd_query *q); 39 void (*end_query)(struct fd_context *ctx, struct fd_query *q); 40 boolean (*get_query_result)(struct fd_context *ctx, 41 struct fd_query *q, boolean wait, 42 union pipe_query_result *result); 43}; 44 45struct fd_query { 46 const struct fd_query_funcs *funcs; 47 bool active; 48 int type; 49}; 50 51static inline struct fd_query * 52fd_query(struct pipe_query *pq) 53{ 54 return (struct fd_query *)pq; 55} 56 57#define FD_QUERY_DRAW_CALLS (PIPE_QUERY_DRIVER_SPECIFIC + 0) 58#define FD_QUERY_BATCH_TOTAL (PIPE_QUERY_DRIVER_SPECIFIC + 1) /* total # of batches (submits) */ 59#define FD_QUERY_BATCH_SYSMEM (PIPE_QUERY_DRIVER_SPECIFIC + 2) /* batches using system memory (GMEM bypass) */ 60#define FD_QUERY_BATCH_GMEM (PIPE_QUERY_DRIVER_SPECIFIC + 3) /* batches using GMEM */ 61#define FD_QUERY_BATCH_NONDRAW (PIPE_QUERY_DRIVER_SPECIFIC + 4) /* compute/blit batches */ 62#define FD_QUERY_BATCH_RESTORE (PIPE_QUERY_DRIVER_SPECIFIC + 5) /* batches requiring GMEM restore */ 63#define FD_QUERY_STAGING_UPLOADS (PIPE_QUERY_DRIVER_SPECIFIC + 6) /* texture/buffer uploads using staging blit */ 64#define FD_QUERY_SHADOW_UPLOADS (PIPE_QUERY_DRIVER_SPECIFIC + 7) /* texture/buffer uploads that shadowed rsc */ 65#define FD_QUERY_VS_REGS (PIPE_QUERY_DRIVER_SPECIFIC + 8) /* avg # of VS registers (scaled up by 100x) */ 66#define FD_QUERY_FS_REGS (PIPE_QUERY_DRIVER_SPECIFIC + 9) /* avg # of VS registers (scaled up by 100x) */ 67/* insert any new non-perfcntr queries here, the first perfcntr index 68 * needs to come last! 69 */ 70#define FD_QUERY_FIRST_PERFCNTR (PIPE_QUERY_DRIVER_SPECIFIC + 10) 71 72void fd_query_screen_init(struct pipe_screen *pscreen); 73void fd_query_context_init(struct pipe_context *pctx); 74 75static inline bool 76skip_begin_query(int type) 77{ 78 switch (type) { 79 case PIPE_QUERY_TIMESTAMP: 80 case PIPE_QUERY_GPU_FINISHED: 81 return true; 82 default: 83 return false; 84 } 85} 86 87/* maps query_type to sample provider idx: */ 88static inline 89int pidx(unsigned query_type) 90{ 91 switch (query_type) { 92 case PIPE_QUERY_OCCLUSION_COUNTER: 93 return 0; 94 case PIPE_QUERY_OCCLUSION_PREDICATE: 95 return 1; 96 case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: 97 return 2; 98 /* TODO currently queries only emitted in main pass (not in binning pass).. 99 * which is fine for occlusion query, but pretty much not anything else. 100 */ 101 case PIPE_QUERY_TIME_ELAPSED: 102 return 3; 103 case PIPE_QUERY_TIMESTAMP: 104 return 4; 105 default: 106 return -1; 107 } 108} 109 110#endif /* FREEDRENO_QUERY_H_ */ 111