13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_state.h" 273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_context.h" 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_screen.h" 33287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_buffer.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_winsys.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_debug.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Fixme: want a public base class for all pipe structs, even if there 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * isn't much in them. 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct pipe_query { 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int dummy; 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_query { 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_query base; 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dQueryType type; 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_winsys_buffer *hwbuf; 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz volatile SVGA3dQueryResult *queryResult; 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle *fence; 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*********************************************************************** 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Inline conversion functions. These are better-typed than the 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * macros used previously: 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE struct svga_query * 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_query( struct pipe_query *q ) 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return (struct svga_query *)q; 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic boolean svga_get_query_result(struct pipe_context *pipe, 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_query *q, 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz boolean wait, 664445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák union pipe_query_result *result); 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic struct pipe_query *svga_create_query( struct pipe_context *pipe, 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned query_type ) 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 71b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca struct svga_context *svga = svga_context( pipe ); 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen(pipe->screen); 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_winsys_screen *sws = svgascreen->sws; 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_query *sq; 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_DBG(DEBUG_QUERY, "%s\n", __FUNCTION__); 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq = CALLOC_STRUCT(svga_query); 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!sq) 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto no_sq; 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq->type = SVGA3D_QUERYTYPE_OCCLUSION; 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 84b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca sq->hwbuf = svga_winsys_buffer_create(svga, 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1, 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_BUFFER_USAGE_PINNED, 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sizeof *sq->queryResult); 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!sq->hwbuf) 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto no_hwbuf; 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq->queryResult = (SVGA3dQueryResult *)sws->buffer_map(sws, 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq->hwbuf, 93287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_TRANSFER_WRITE); 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!sq->queryResult) 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto no_query_result; 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq->queryResult->totalSize = sizeof *sq->queryResult; 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq->queryResult->state = SVGA3D_QUERYSTATE_NEW; 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * We request the buffer to be pinned and assume it is always mapped. 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The reason is that we don't want to wait for fences when checking the 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * query status. 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sws->buffer_unmap(sws, sq->hwbuf); 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return &sq->base; 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzno_query_result: 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sws->buffer_destroy(sws, sq->hwbuf); 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzno_hwbuf: 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(sq); 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzno_sq: 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_destroy_query(struct pipe_context *pipe, 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_query *q) 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen(pipe->screen); 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_winsys_screen *sws = svgascreen->sws; 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_query *sq = svga_query( q ); 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_DBG(DEBUG_QUERY, "%s\n", __FUNCTION__); 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sws->buffer_destroy(sws, sq->hwbuf); 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sws->fence_reference(sws, &sq->fence, NULL); 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(sq); 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_begin_query(struct pipe_context *pipe, 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_query *q) 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen(pipe->screen); 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_winsys_screen *sws = svgascreen->sws; 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context( pipe ); 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_query *sq = svga_query( q ); 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret; 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_DBG(DEBUG_QUERY, "%s\n", __FUNCTION__); 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(!svga->sq); 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Need to flush out buffered drawing commands so that they don't 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * get counted in the query results. 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_hwtnl_flush_retry(svga); 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(sq->queryResult->state == SVGA3D_QUERYSTATE_PENDING) { 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* The application doesn't care for the pending query result. We cannot 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * let go the existing buffer and just get a new one because its storage 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * may be reused for other purposes and clobbered by the host when it 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * determines the query result. So the only option here is to wait for 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * the existing query's result -- not a big deal, given that no sane 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * application would do this. 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz uint64_t result; 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1594445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák svga_get_query_result(pipe, q, TRUE, (void*)&result); 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(sq->queryResult->state != SVGA3D_QUERYSTATE_PENDING); 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq->queryResult->state = SVGA3D_QUERYSTATE_NEW; 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sws->fence_reference(sws, &sq->fence, NULL); 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_BeginQuery(svga->swc, sq->type); 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(ret != PIPE_OK) { 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush(svga, NULL); 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_BeginQuery(svga->swc, sq->type); 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(ret == PIPE_OK); 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->sq = sq; 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_end_query(struct pipe_context *pipe, 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_query *q) 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context( pipe ); 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_query *sq = svga_query( q ); 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret; 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_DBG(DEBUG_QUERY, "%s\n", __FUNCTION__); 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(svga->sq == sq); 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_hwtnl_flush_retry(svga); 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Set to PENDING before sending EndQuery. */ 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sq->queryResult->state = SVGA3D_QUERYSTATE_PENDING; 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_EndQuery( svga->swc, sq->type, sq->hwbuf); 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(ret != PIPE_OK) { 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush(svga, NULL); 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_EndQuery( svga->swc, sq->type, sq->hwbuf); 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(ret == PIPE_OK); 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* TODO: Delay flushing. We don't really need to flush here, just ensure 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * that there is one flush before svga_get_query_result attempts to get the 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * result */ 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush(svga, NULL); 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->sq = NULL; 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic boolean svga_get_query_result(struct pipe_context *pipe, 2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_query *q, 2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz boolean wait, 2104445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák union pipe_query_result *vresult) 2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context( pipe ); 2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen( pipe->screen ); 2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_winsys_screen *sws = svgascreen->sws; 2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_query *sq = svga_query( q ); 2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dQueryState state; 21734f7681669987bc804f4603463f2fa3f82bc844fZack Rusin uint64_t *result = (uint64_t*)vresult; 2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_DBG(DEBUG_QUERY, "%s wait: %d\n", __FUNCTION__); 2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* The query status won't be updated by the host unless 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA_3D_CMD_WAIT_FOR_QUERY is emitted. Unfortunately this will cause a 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * synchronous wait on the host */ 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!sq->fence) { 2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret; 2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_WaitForQuery( svga->swc, sq->type, sq->hwbuf); 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(ret != PIPE_OK) { 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush(svga, NULL); 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_WaitForQuery( svga->swc, sq->type, sq->hwbuf); 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(ret == PIPE_OK); 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush(svga, &sq->fence); 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(sq->fence); 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz state = sq->queryResult->state; 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(state == SVGA3D_QUERYSTATE_PENDING) { 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!wait) 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return FALSE; 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 244e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom sws->fence_finish(sws, sq->fence, SVGA_FENCE_FLAG_QUERY); 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz state = sq->queryResult->state; 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(state == SVGA3D_QUERYSTATE_SUCCEEDED || 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz state == SVGA3D_QUERYSTATE_FAILED); 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *result = (uint64_t)sq->queryResult->result32; 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_DBG(DEBUG_QUERY, "%s result %d\n", __FUNCTION__, (unsigned)*result); 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return TRUE; 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_init_query_functions( struct svga_context *svga ) 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.create_query = svga_create_query; 2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.destroy_query = svga_destroy_query; 2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.begin_query = svga_begin_query; 2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.end_query = svga_end_query; 2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.get_query_result = svga_get_query_result; 2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 269