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