1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/************************************************************************** 2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 3946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Copyright 2010 VMware, Inc. 5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved. 6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the 9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including 10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to 13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions: 14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the 16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions 17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software. 18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR 23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/ 28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 2986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/* Authors: 3086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Keith Whitwell, Qicheng Christopher Li, Brian Paul 31946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 32946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "draw/draw_context.h" 34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "pipe/p_defines.h" 35946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h" 36946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "lp_context.h" 37378796fe119ea61742df914b4de9ca4ed6bcc223José Fonseca#include "lp_flush.h" 38b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell#include "lp_fence.h" 39946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "lp_query.h" 40946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "lp_state.h" 41946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 42946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 43946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastatic struct llvmpipe_query *llvmpipe_query( struct pipe_query *p ) 44946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 45946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return (struct llvmpipe_query *)p; 46946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 47946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 48946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastatic struct pipe_query * 49946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_create_query(struct pipe_context *pipe, 503ed0a099c70e9d771e60e0ddf70bc0b5ba83a483Roland Scheidegger unsigned type) 51946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 5286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq; 5386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 54946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca assert(type == PIPE_QUERY_OCCLUSION_COUNTER); 5586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 5686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li pq = CALLOC_STRUCT( llvmpipe_query ); 5786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 5886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li return (struct pipe_query *) pq; 59946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 60946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 61946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 62946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastatic void 63946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_destroy_query(struct pipe_context *pipe, struct pipe_query *q) 64946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 6586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq = llvmpipe_query(q); 6618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 6718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell /* Ideally we would refcount queries & not get destroyed until the 6818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell * last scene had finished with us. 6918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell */ 7018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (pq->fence) { 7118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (!lp_fence_issued(pq->fence)) 727e02303497237cde958c28608477d0c355a8038bMarek Olšák llvmpipe_flush(pipe, NULL, __FUNCTION__); 7318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 7418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (!lp_fence_signalled(pq->fence)) 7518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_wait(pq->fence); 7618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 7718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference(&pq->fence, NULL); 783ed0a099c70e9d771e60e0ddf70bc0b5ba83a483Roland Scheidegger } 793ed0a099c70e9d771e60e0ddf70bc0b5ba83a483Roland Scheidegger 8086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li FREE(pq); 8186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li} 8286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 8386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 8486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Listatic boolean 8586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lillvmpipe_get_query_result(struct pipe_context *pipe, 863ed0a099c70e9d771e60e0ddf70bc0b5ba83a483Roland Scheidegger struct pipe_query *q, 873ed0a099c70e9d771e60e0ddf70bc0b5ba83a483Roland Scheidegger boolean wait, 884445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák union pipe_query_result *vresult) 8986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{ 9086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq = llvmpipe_query(q); 9134f7681669987bc804f4603463f2fa3f82bc844fZack Rusin uint64_t *result = (uint64_t *)vresult; 9218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell int i; 9386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 9418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (!pq->fence) { 957888a2f82200738ac03c78d9900eb028d48725a1Brian Paul /* no fence because there was no scene, so results is zero */ 967888a2f82200738ac03c78d9900eb028d48725a1Brian Paul *result = 0; 977888a2f82200738ac03c78d9900eb028d48725a1Brian Paul return TRUE; 9818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 9918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 10018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (!lp_fence_signalled(pq->fence)) { 10118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (!lp_fence_issued(pq->fence)) 1027e02303497237cde958c28608477d0c355a8038bMarek Olšák llvmpipe_flush(pipe, NULL, __FUNCTION__); 10318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 10418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (!wait) 10518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell return FALSE; 10618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 10718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_wait(pq->fence); 10886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li } 10986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 11018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell /* Sum the results from each of the threads: 11118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell */ 11218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell *result = 0; 11318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell for (i = 0; i < LP_MAX_THREADS; i++) { 11418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell *result += pq->count[i]; 11586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li } 11686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 11718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell return TRUE; 118946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 119946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 120946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 121946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastatic void 122946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q) 123946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 124946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe ); 12586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq = llvmpipe_query(q); 12686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 127040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell /* Check if the query is already in the scene. If so, we need to 128040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell * flush the scene now. Real apps shouldn't re-use a query in a 129040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell * frame of rendering. 130040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell */ 131040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell if (pq->fence && !lp_fence_issued(pq->fence)) { 132040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell llvmpipe_finish(pipe, __FUNCTION__); 133040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell } 134040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell 135040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell 136040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell memset(pq->count, 0, sizeof(pq->count)); 13786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li lp_setup_begin_query(llvmpipe->setup, pq); 13886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 139946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca llvmpipe->active_query_count++; 140c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca llvmpipe->dirty |= LP_NEW_QUERY; 141946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 142946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 143946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 144946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastatic void 145946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_end_query(struct pipe_context *pipe, struct pipe_query *q) 146946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 147946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca struct llvmpipe_context *llvmpipe = llvmpipe_context( pipe ); 14886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq = llvmpipe_query(q); 14986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 15086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li lp_setup_end_query(llvmpipe->setup, pq); 151946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 15286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li assert(llvmpipe->active_query_count); 153946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca llvmpipe->active_query_count--; 154c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca llvmpipe->dirty |= LP_NEW_QUERY; 155946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 156946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 157ab14915dce41b26faabba878446b0ec0c8734434Dave Airlieboolean 158ab14915dce41b26faabba878446b0ec0c8734434Dave Airliellvmpipe_check_render_cond(struct llvmpipe_context *lp) 159ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie{ 160ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie struct pipe_context *pipe = &lp->pipe; 161ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie boolean b, wait; 162ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie uint64_t result; 163ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie 164ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie if (!lp->render_cond_query) 165ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie return TRUE; /* no query predicate, draw normally */ 166ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie wait = (lp->render_cond_mode == PIPE_RENDER_COND_WAIT || 167ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie lp->render_cond_mode == PIPE_RENDER_COND_BY_REGION_WAIT); 168ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie 1694445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák b = pipe->get_query_result(pipe, lp->render_cond_query, wait, (void*)&result); 170ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie if (b) 171ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie return result > 0; 172ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie else 173ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie return TRUE; 174ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie} 175946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 176946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid llvmpipe_init_query_funcs(struct llvmpipe_context *llvmpipe ) 177946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 178946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca llvmpipe->pipe.create_query = llvmpipe_create_query; 179946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca llvmpipe->pipe.destroy_query = llvmpipe_destroy_query; 180946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca llvmpipe->pipe.begin_query = llvmpipe_begin_query; 181946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca llvmpipe->pipe.end_query = llvmpipe_end_query; 182946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca llvmpipe->pipe.get_query_result = llvmpipe_get_query_result; 183946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 184946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 185946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 186