gallium: add basic support for stream output queries
This commit is contained in:
parent
34f7681669
commit
be7d8ddf0c
|
@ -86,6 +86,7 @@ struct softpipe_context {
|
||||||
int so_count[PIPE_MAX_SO_BUFFERS];
|
int so_count[PIPE_MAX_SO_BUFFERS];
|
||||||
int num_buffers;
|
int num_buffers;
|
||||||
} so_target;
|
} so_target;
|
||||||
|
struct pipe_query_data_so_statistics so_stats;
|
||||||
|
|
||||||
unsigned num_samplers;
|
unsigned num_samplers;
|
||||||
unsigned num_sampler_views;
|
unsigned num_sampler_views;
|
||||||
|
|
|
@ -549,6 +549,11 @@ sp_vbuf_so_info(struct vbuf_render *vbr, uint buffer, uint vertices)
|
||||||
struct softpipe_context *softpipe = cvbr->softpipe;
|
struct softpipe_context *softpipe = cvbr->softpipe;
|
||||||
|
|
||||||
softpipe->so_target.so_count[buffer] += vertices;
|
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*/;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ struct softpipe_query {
|
||||||
unsigned type;
|
unsigned type;
|
||||||
uint64_t start;
|
uint64_t start;
|
||||||
uint64_t end;
|
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;
|
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 = CALLOC_STRUCT( softpipe_query );
|
||||||
sq->type = type;
|
sq->type = type;
|
||||||
|
|
||||||
|
@ -83,6 +86,9 @@ softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
|
||||||
case PIPE_QUERY_TIME_ELAPSED:
|
case PIPE_QUERY_TIME_ELAPSED:
|
||||||
sq->start = 1000*os_time_get();
|
sq->start = 1000*os_time_get();
|
||||||
break;
|
break;
|
||||||
|
case PIPE_QUERY_SO_STATISTICS:
|
||||||
|
sq->so.num_primitives_written = 0;
|
||||||
|
sq->so.primitives_storage_needed = 0;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
break;
|
break;
|
||||||
|
@ -106,6 +112,11 @@ softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
|
||||||
case PIPE_QUERY_TIME_ELAPSED:
|
case PIPE_QUERY_TIME_ELAPSED:
|
||||||
sq->end = 1000*os_time_get();
|
sq->end = 1000*os_time_get();
|
||||||
break;
|
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:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
break;
|
break;
|
||||||
|
@ -122,7 +133,16 @@ softpipe_get_query_result(struct pipe_context *pipe,
|
||||||
{
|
{
|
||||||
struct softpipe_query *sq = softpipe_query(q);
|
struct softpipe_query *sq = softpipe_query(q);
|
||||||
uint64_t *result = (uint64_t*)vresult;
|
uint64_t *result = (uint64_t*)vresult;
|
||||||
|
|
||||||
|
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;
|
*result = sq->end - sq->start;
|
||||||
|
break;
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -381,7 +381,8 @@ enum pipe_transfer_usage {
|
||||||
#define PIPE_QUERY_PRIMITIVES_GENERATED 1
|
#define PIPE_QUERY_PRIMITIVES_GENERATED 1
|
||||||
#define PIPE_QUERY_PRIMITIVES_EMITTED 2
|
#define PIPE_QUERY_PRIMITIVES_EMITTED 2
|
||||||
#define PIPE_QUERY_TIME_ELAPSED 3
|
#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_READ (1 << 0)
|
||||||
#define PIPE_REFERENCED_FOR_WRITE (1 << 1)
|
#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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue