1848b8605Smrg/* 2848b8605Smrg * Copyright (C) 2013 Rob Clark <robclark@freedesktop.org> 3848b8605Smrg * 4848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5848b8605Smrg * copy of this software and associated documentation files (the "Software"), 6848b8605Smrg * to deal in the Software without restriction, including without limitation 7848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 9848b8605Smrg * Software is furnished to do so, subject to the following conditions: 10848b8605Smrg * 11848b8605Smrg * The above copyright notice and this permission notice (including the next 12848b8605Smrg * paragraph) shall be included in all copies or substantial portions of the 13848b8605Smrg * Software. 14848b8605Smrg * 15848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16848b8605Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19848b8605Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20848b8605Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21848b8605Smrg * SOFTWARE. 22848b8605Smrg * 23848b8605Smrg * Authors: 24848b8605Smrg * Rob Clark <robclark@freedesktop.org> 25848b8605Smrg */ 26848b8605Smrg 27848b8605Smrg#ifndef FREEDRENO_QUERY_H_ 28848b8605Smrg#define FREEDRENO_QUERY_H_ 29848b8605Smrg 30848b8605Smrg#include "pipe/p_context.h" 31848b8605Smrg 32848b8605Smrgstruct fd_context; 33848b8605Smrgstruct fd_query; 34848b8605Smrg 35848b8605Smrgstruct fd_query_funcs { 36848b8605Smrg void (*destroy_query)(struct fd_context *ctx, 37848b8605Smrg struct fd_query *q); 38b8e80941Smrg boolean (*begin_query)(struct fd_context *ctx, struct fd_query *q); 39848b8605Smrg void (*end_query)(struct fd_context *ctx, struct fd_query *q); 40848b8605Smrg boolean (*get_query_result)(struct fd_context *ctx, 41848b8605Smrg struct fd_query *q, boolean wait, 42848b8605Smrg union pipe_query_result *result); 43848b8605Smrg}; 44848b8605Smrg 45848b8605Smrgstruct fd_query { 46848b8605Smrg const struct fd_query_funcs *funcs; 47848b8605Smrg bool active; 48848b8605Smrg int type; 49848b8605Smrg}; 50848b8605Smrg 51848b8605Smrgstatic inline struct fd_query * 52848b8605Smrgfd_query(struct pipe_query *pq) 53848b8605Smrg{ 54848b8605Smrg return (struct fd_query *)pq; 55848b8605Smrg} 56848b8605Smrg 57848b8605Smrg#define FD_QUERY_DRAW_CALLS (PIPE_QUERY_DRIVER_SPECIFIC + 0) 58848b8605Smrg#define FD_QUERY_BATCH_TOTAL (PIPE_QUERY_DRIVER_SPECIFIC + 1) /* total # of batches (submits) */ 59848b8605Smrg#define FD_QUERY_BATCH_SYSMEM (PIPE_QUERY_DRIVER_SPECIFIC + 2) /* batches using system memory (GMEM bypass) */ 60848b8605Smrg#define FD_QUERY_BATCH_GMEM (PIPE_QUERY_DRIVER_SPECIFIC + 3) /* batches using GMEM */ 61b8e80941Smrg#define FD_QUERY_BATCH_NONDRAW (PIPE_QUERY_DRIVER_SPECIFIC + 4) /* compute/blit batches */ 62b8e80941Smrg#define FD_QUERY_BATCH_RESTORE (PIPE_QUERY_DRIVER_SPECIFIC + 5) /* batches requiring GMEM restore */ 63b8e80941Smrg#define FD_QUERY_STAGING_UPLOADS (PIPE_QUERY_DRIVER_SPECIFIC + 6) /* texture/buffer uploads using staging blit */ 64b8e80941Smrg#define FD_QUERY_SHADOW_UPLOADS (PIPE_QUERY_DRIVER_SPECIFIC + 7) /* texture/buffer uploads that shadowed rsc */ 65b8e80941Smrg#define FD_QUERY_VS_REGS (PIPE_QUERY_DRIVER_SPECIFIC + 8) /* avg # of VS registers (scaled up by 100x) */ 66b8e80941Smrg#define FD_QUERY_FS_REGS (PIPE_QUERY_DRIVER_SPECIFIC + 9) /* avg # of VS registers (scaled up by 100x) */ 67b8e80941Smrg/* insert any new non-perfcntr queries here, the first perfcntr index 68b8e80941Smrg * needs to come last! 69b8e80941Smrg */ 70b8e80941Smrg#define FD_QUERY_FIRST_PERFCNTR (PIPE_QUERY_DRIVER_SPECIFIC + 10) 71848b8605Smrg 72848b8605Smrgvoid fd_query_screen_init(struct pipe_screen *pscreen); 73848b8605Smrgvoid fd_query_context_init(struct pipe_context *pctx); 74848b8605Smrg 75b8e80941Smrgstatic inline bool 76b8e80941Smrgskip_begin_query(int type) 77b8e80941Smrg{ 78b8e80941Smrg switch (type) { 79b8e80941Smrg case PIPE_QUERY_TIMESTAMP: 80b8e80941Smrg case PIPE_QUERY_GPU_FINISHED: 81b8e80941Smrg return true; 82b8e80941Smrg default: 83b8e80941Smrg return false; 84b8e80941Smrg } 85b8e80941Smrg} 86b8e80941Smrg 87b8e80941Smrg/* maps query_type to sample provider idx: */ 88b8e80941Smrgstatic inline 89b8e80941Smrgint pidx(unsigned query_type) 90b8e80941Smrg{ 91b8e80941Smrg switch (query_type) { 92b8e80941Smrg case PIPE_QUERY_OCCLUSION_COUNTER: 93b8e80941Smrg return 0; 94b8e80941Smrg case PIPE_QUERY_OCCLUSION_PREDICATE: 95b8e80941Smrg return 1; 96b8e80941Smrg case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: 97b8e80941Smrg return 2; 98b8e80941Smrg /* TODO currently queries only emitted in main pass (not in binning pass).. 99b8e80941Smrg * which is fine for occlusion query, but pretty much not anything else. 100b8e80941Smrg */ 101b8e80941Smrg case PIPE_QUERY_TIME_ELAPSED: 102b8e80941Smrg return 3; 103b8e80941Smrg case PIPE_QUERY_TIMESTAMP: 104b8e80941Smrg return 4; 105b8e80941Smrg default: 106b8e80941Smrg return -1; 107b8e80941Smrg } 108b8e80941Smrg} 109b8e80941Smrg 110848b8605Smrg#endif /* FREEDRENO_QUERY_H_ */ 111