1/* 2 * Copyright (c) 2016 Etnaviv Project 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, sub license, 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 12 * next paragraph) shall be included in all copies or substantial portions 13 * of the 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 NON-INFRINGEMENT. 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 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: 24 * Rob Clark <robclark@freedesktop.org> 25 * Christian Gmeiner <christian.gmeiner@gmail.com> 26 */ 27 28#include "pipe/p_screen.h" 29#include "util/u_inlines.h" 30 31#include "etnaviv_context.h" 32#include "etnaviv_perfmon.h" 33#include "etnaviv_query.h" 34#include "etnaviv_query_acc.h" 35#include "etnaviv_query_sw.h" 36 37static struct pipe_query * 38etna_create_query(struct pipe_context *pctx, unsigned query_type, 39 unsigned index) 40{ 41 struct etna_context *ctx = etna_context(pctx); 42 struct etna_query *q; 43 44 q = etna_sw_create_query(ctx, query_type); 45 if (!q) 46 q = etna_acc_create_query(ctx, query_type); 47 48 return (struct pipe_query *)q; 49} 50 51static void 52etna_destroy_query(struct pipe_context *pctx, struct pipe_query *pq) 53{ 54 struct etna_query *q = etna_query(pq); 55 56 q->funcs->destroy_query(etna_context(pctx), q); 57} 58 59static bool 60etna_begin_query(struct pipe_context *pctx, struct pipe_query *pq) 61{ 62 struct etna_query *q = etna_query(pq); 63 64 q->funcs->begin_query(etna_context(pctx), q); 65 66 return true; 67} 68 69static bool 70etna_end_query(struct pipe_context *pctx, struct pipe_query *pq) 71{ 72 struct etna_query *q = etna_query(pq); 73 74 q->funcs->end_query(etna_context(pctx), q); 75 76 return true; 77} 78 79static bool 80etna_get_query_result(struct pipe_context *pctx, struct pipe_query *pq, 81 bool wait, union pipe_query_result *result) 82{ 83 struct etna_query *q = etna_query(pq); 84 85 util_query_clear_result(result, q->type); 86 87 return q->funcs->get_query_result(etna_context(pctx), q, wait, result); 88} 89 90static int 91etna_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, 92 struct pipe_driver_query_info *info) 93{ 94 int nr_sw_queries = etna_sw_get_driver_query_info(pscreen, 0, NULL); 95 int nr_pm_queries = etna_pm_get_driver_query_info(pscreen, 0, NULL); 96 97 if (!info) 98 return nr_sw_queries + nr_pm_queries; 99 100 if (index < nr_sw_queries) 101 return etna_sw_get_driver_query_info(pscreen, index, info); 102 103 return etna_pm_get_driver_query_info(pscreen, index - nr_sw_queries, info); 104} 105 106static int 107etna_get_driver_query_group_info(struct pipe_screen *pscreen, unsigned index, 108 struct pipe_driver_query_group_info *info) 109{ 110 int nr_sw_groups = etna_sw_get_driver_query_group_info(pscreen, 0, NULL); 111 int nr_pm_groups = etna_pm_get_driver_query_group_info(pscreen, 0, NULL); 112 113 if (!info) 114 return nr_sw_groups + nr_pm_groups; 115 116 if (index < nr_sw_groups) 117 return etna_sw_get_driver_query_group_info(pscreen, index, info); 118 119 return etna_pm_get_driver_query_group_info(pscreen, index, info); 120} 121 122static void 123etna_set_active_query_state(struct pipe_context *pctx, bool enable) 124{ 125 struct etna_context *ctx = etna_context(pctx); 126 127 if (enable) { 128 list_for_each_entry(struct etna_acc_query, aq, &ctx->active_acc_queries, node) 129 etna_acc_query_resume(aq, ctx); 130 } else { 131 list_for_each_entry(struct etna_acc_query, aq, &ctx->active_acc_queries, node) 132 etna_acc_query_suspend(aq, ctx); 133 } 134} 135 136void 137etna_query_screen_init(struct pipe_screen *pscreen) 138{ 139 pscreen->get_driver_query_info = etna_get_driver_query_info; 140 pscreen->get_driver_query_group_info = etna_get_driver_query_group_info; 141} 142 143void 144etna_query_context_init(struct pipe_context *pctx) 145{ 146 pctx->create_query = etna_create_query; 147 pctx->destroy_query = etna_destroy_query; 148 pctx->begin_query = etna_begin_query; 149 pctx->end_query = etna_end_query; 150 pctx->get_query_result = etna_get_query_result; 151 pctx->set_active_query_state = etna_set_active_query_state; 152} 153