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_query.h" 33#include "etnaviv_query_hw.h" 34#include "etnaviv_query_sw.h" 35#include "etnaviv_query_pm.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_hw_create_query(ctx, query_type); 47 if (!q) 48 q = etna_pm_create_query(ctx, query_type); 49 50 return (struct pipe_query *)q; 51} 52 53static void 54etna_destroy_query(struct pipe_context *pctx, struct pipe_query *pq) 55{ 56 struct etna_query *q = etna_query(pq); 57 58 q->funcs->destroy_query(etna_context(pctx), q); 59} 60 61static boolean 62etna_begin_query(struct pipe_context *pctx, struct pipe_query *pq) 63{ 64 struct etna_query *q = etna_query(pq); 65 boolean ret; 66 67 if (q->active) 68 return false; 69 70 ret = q->funcs->begin_query(etna_context(pctx), q); 71 q->active = ret; 72 73 return ret; 74} 75 76static bool 77etna_end_query(struct pipe_context *pctx, struct pipe_query *pq) 78{ 79 struct etna_query *q = etna_query(pq); 80 81 if (!q->active) 82 return false; 83 84 q->funcs->end_query(etna_context(pctx), q); 85 q->active = false; 86 87 return true; 88} 89 90static boolean 91etna_get_query_result(struct pipe_context *pctx, struct pipe_query *pq, 92 boolean wait, union pipe_query_result *result) 93{ 94 struct etna_query *q = etna_query(pq); 95 96 if (q->active) 97 return false; 98 99 util_query_clear_result(result, q->type); 100 101 return q->funcs->get_query_result(etna_context(pctx), q, wait, result); 102} 103 104static int 105etna_get_driver_query_info(struct pipe_screen *pscreen, unsigned index, 106 struct pipe_driver_query_info *info) 107{ 108 int nr_sw_queries = etna_sw_get_driver_query_info(pscreen, 0, NULL); 109 int nr_pm_queries = etna_pm_get_driver_query_info(pscreen, 0, NULL); 110 111 if (!info) 112 return nr_sw_queries + nr_pm_queries; 113 114 if (index < nr_sw_queries) 115 return etna_sw_get_driver_query_info(pscreen, index, info); 116 117 return etna_pm_get_driver_query_info(pscreen, index - nr_sw_queries, info); 118} 119 120static int 121etna_get_driver_query_group_info(struct pipe_screen *pscreen, unsigned index, 122 struct pipe_driver_query_group_info *info) 123{ 124 int nr_sw_groups = etna_sw_get_driver_query_group_info(pscreen, 0, NULL); 125 int nr_pm_groups = etna_pm_get_driver_query_group_info(pscreen, 0, NULL); 126 127 if (!info) 128 return nr_sw_groups + nr_pm_groups; 129 130 if (index < nr_sw_groups) 131 return etna_sw_get_driver_query_group_info(pscreen, index, info); 132 133 return etna_pm_get_driver_query_group_info(pscreen, index, info); 134} 135 136static void 137etna_set_active_query_state(struct pipe_context *pipe, boolean enable) 138{ 139} 140 141void 142etna_query_screen_init(struct pipe_screen *pscreen) 143{ 144 pscreen->get_driver_query_info = etna_get_driver_query_info; 145 pscreen->get_driver_query_group_info = etna_get_driver_query_group_info; 146} 147 148void 149etna_query_context_init(struct pipe_context *pctx) 150{ 151 pctx->create_query = etna_create_query; 152 pctx->destroy_query = etna_destroy_query; 153 pctx->begin_query = etna_begin_query; 154 pctx->end_query = etna_end_query; 155 pctx->get_query_result = etna_get_query_result; 156 pctx->set_active_query_state = etna_set_active_query_state; 157} 158