#include "svga3d_shaderdefs.h"
+/** Non-GPU queries for gallium HUD */
+#define SVGA_QUERY_DRAW_CALLS (PIPE_QUERY_DRIVER_SPECIFIC + 0)
+#define SVGA_QUERY_FALLBACKS (PIPE_QUERY_DRIVER_SPECIFIC + 1)
+
+
struct draw_vertex_shader;
struct draw_fragment_shader;
struct svga_shader_result;
/** List of buffers with queued transfers */
struct list_head dirty_buffers;
+
+ /** performance / info queries */
+ uint64_t num_draw_calls; /**< SVGA_QUERY_DRAW_CALLS */
+ uint64_t num_fallbacks; /**< SVGA_QUERY_FALLBACKS */
};
/* A flag for each state_tracker state object:
enum pipe_error ret = 0;
boolean needed_swtnl;
+ svga->num_draw_calls++; /* for SVGA_QUERY_DRAW_CALLS */
+
if (!u_trim_pipe_prim( info->mode, &count ))
return;
#endif
if (svga->state.sw.need_swtnl) {
+ svga->num_fallbacks++; /* for SVGA_QUERY_FALLBACKS */
if (!needed_swtnl) {
/*
* We're switching from HW to SW TNL. SW TNL will require mapping all
struct svga_winsys_buffer *hwbuf;
volatile SVGA3dQueryResult *queryResult;
struct pipe_fence_handle *fence;
+
+ /** For non-GPU SVGA_QUERY_x queries */
+ uint64_t begin_count, end_count;
};
/***********************************************************************
*/
sws->buffer_unmap(sws, sq->hwbuf);
break;
+ case SVGA_QUERY_DRAW_CALLS:
+ case SVGA_QUERY_FALLBACKS:
+ break;
default:
assert(!"unexpected query type in svga_create_query()");
}
sws->buffer_destroy(sws, sq->hwbuf);
sws->fence_reference(sws, &sq->fence, NULL);
break;
+ case SVGA_QUERY_DRAW_CALLS:
+ case SVGA_QUERY_FALLBACKS:
+ /* nothing */
+ break;
default:
assert(!"svga: unexpected query type in svga_destroy_query()");
}
svga->sq = sq;
break;
+ case SVGA_QUERY_DRAW_CALLS:
+ sq->begin_count = svga->num_draw_calls;
+ break;
+ case SVGA_QUERY_FALLBACKS:
+ sq->begin_count = svga->num_fallbacks;
+ break;
default:
assert(!"unexpected query type in svga_begin_query()");
}
svga->sq = NULL;
break;
+ case SVGA_QUERY_DRAW_CALLS:
+ sq->end_count = svga->num_draw_calls;
+ break;
+ case SVGA_QUERY_FALLBACKS:
+ sq->end_count = svga->num_fallbacks;
+ break;
default:
assert(!"unexpected query type in svga_end_query()");
}
*result = (uint64_t)sq->queryResult->result32;
break;
+ case SVGA_QUERY_DRAW_CALLS:
+ /* fall-through */
+ case SVGA_QUERY_FALLBACKS:
+ vresult->u64 = sq->end_count - sq->begin_count;
+ break;
default:
assert(!"unexpected query type in svga_get_query_result");
}
}
+static int
+svga_get_driver_query_info(struct pipe_screen *screen,
+ unsigned index,
+ struct pipe_driver_query_info *info)
+{
+ static const struct pipe_driver_query_info queries[] = {
+ {"draw-calls", SVGA_QUERY_DRAW_CALLS, 0, FALSE},
+ {"fallbacks", SVGA_QUERY_FALLBACKS, 0, FALSE}
+ };
+
+ if (!info)
+ return Elements(queries);
+
+ if (index >= Elements(queries))
+ return 0;
+
+ *info = queries[index];
+ return 1;
+}
+
+
static void
svga_destroy_screen( struct pipe_screen *screen )
{
screen->fence_reference = svga_fence_reference;
screen->fence_signalled = svga_fence_signalled;
screen->fence_finish = svga_fence_finish;
+ screen->get_driver_query_info = svga_get_driver_query_info;
svgascreen->sws = sws;
svga_init_screen_resource_functions(svgascreen);