gallium: add basic support for stream output queries

This commit is contained in:
Zack Rusin 2010-06-07 12:14:56 -04:00
parent 34f7681669
commit be7d8ddf0c
4 changed files with 38 additions and 3 deletions

View File

@ -86,6 +86,7 @@ struct softpipe_context {
int so_count[PIPE_MAX_SO_BUFFERS];
int num_buffers;
} so_target;
struct pipe_query_data_so_statistics so_stats;
unsigned num_samplers;
unsigned num_sampler_views;

View File

@ -549,6 +549,11 @@ sp_vbuf_so_info(struct vbuf_render *vbr, uint buffer, uint vertices)
struct softpipe_context *softpipe = cvbr->softpipe;
softpipe->so_target.so_count[buffer] += vertices;
softpipe->so_stats.num_primitives_written =
vertices / u_vertices_per_prim(cvbr->prim);
softpipe->so_stats.primitives_storage_needed =
vertices * 4 /*sizeof(float|int32)*/ * 4 /*x,y,z,w*/;
}

View File

@ -41,6 +41,7 @@ struct softpipe_query {
unsigned type;
uint64_t start;
uint64_t end;
struct pipe_query_data_so_statistics so;
};
@ -55,7 +56,9 @@ softpipe_create_query(struct pipe_context *pipe,
{
struct softpipe_query* sq;
assert(type == PIPE_QUERY_OCCLUSION_COUNTER || type == PIPE_QUERY_TIME_ELAPSED);
assert(type == PIPE_QUERY_OCCLUSION_COUNTER ||
type == PIPE_QUERY_TIME_ELAPSED ||
type == PIPE_QUERY_SO_STATISTICS);
sq = CALLOC_STRUCT( softpipe_query );
sq->type = type;
@ -83,6 +86,9 @@ softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
case PIPE_QUERY_TIME_ELAPSED:
sq->start = 1000*os_time_get();
break;
case PIPE_QUERY_SO_STATISTICS:
sq->so.num_primitives_written = 0;
sq->so.primitives_storage_needed = 0;
default:
assert(0);
break;
@ -106,6 +112,11 @@ softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
case PIPE_QUERY_TIME_ELAPSED:
sq->end = 1000*os_time_get();
break;
case PIPE_QUERY_SO_STATISTICS:
sq->so.num_primitives_written =
softpipe->so_stats.num_primitives_written;
sq->so.primitives_storage_needed =
softpipe->so_stats.primitives_storage_needed;
default:
assert(0);
break;
@ -122,7 +133,16 @@ softpipe_get_query_result(struct pipe_context *pipe,
{
struct softpipe_query *sq = softpipe_query(q);
uint64_t *result = (uint64_t*)vresult;
*result = sq->end - sq->start;
switch (sq->type) {
case PIPE_QUERY_SO_STATISTICS:
memcpy(vresult, &sq->so,
sizeof(struct pipe_query_data_so_statistics));
break;
default:
*result = sq->end - sq->start;
break;
}
return TRUE;
}

View File

@ -381,7 +381,8 @@ enum pipe_transfer_usage {
#define PIPE_QUERY_PRIMITIVES_GENERATED 1
#define PIPE_QUERY_PRIMITIVES_EMITTED 2
#define PIPE_QUERY_TIME_ELAPSED 3
#define PIPE_QUERY_TYPES 4
#define PIPE_QUERY_SO_STATISTICS 5
#define PIPE_QUERY_TYPES 6
/**
@ -498,6 +499,14 @@ enum pipe_cap {
#define PIPE_REFERENCED_FOR_READ (1 << 0)
#define PIPE_REFERENCED_FOR_WRITE (1 << 1)
/**
* Composite query types
*/
struct pipe_query_data_so_statistics
{
uint64_t num_primitives_written;
uint64_t primitives_storage_needed;
};
#ifdef __cplusplus
}