gallium: EXT_timer_query support.

Signed-off-by: Corbin Simpson <MostAwesomeDude@gmail.com>
This commit is contained in:
Mathias Fröhlich
2010-05-17 11:48:56 -07:00
committed by Corbin Simpson
parent fea91ee22d
commit cdbd5f4203
13 changed files with 57 additions and 5 deletions

View File

@@ -76,6 +76,8 @@ cell_get_param(struct pipe_screen *screen, enum pipe_cap param)
return 1; return 1;
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 1; return 1;
case PIPE_CAP_TIMER_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP: case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 10; return 10;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:

View File

@@ -113,6 +113,8 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap param)
return 1; return 1;
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 0; return 0;
case PIPE_CAP_TIMER_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP: case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1; return 1;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:

View File

@@ -172,6 +172,8 @@ brw_get_param(struct pipe_screen *screen, enum pipe_cap param)
return 1; return 1;
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 0; return 0;
case PIPE_CAP_TIMER_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP: case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1; return 1;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:

View File

@@ -105,6 +105,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
return PIPE_MAX_COLOR_BUFS; return PIPE_MAX_COLOR_BUFS;
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 1; return 1;
case PIPE_CAP_TIMER_QUERY:
return 0;
case PIPE_CAP_TEXTURE_MIRROR_CLAMP: case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
return 1; return 1;
case PIPE_CAP_TEXTURE_MIRROR_REPEAT: case PIPE_CAP_TEXTURE_MIRROR_REPEAT:

View File

@@ -125,6 +125,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
return 8; return 8;
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 1; return 1;
case PIPE_CAP_TIMER_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP: case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1; return 1;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:

View File

@@ -52,6 +52,8 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
return screen->is_nv4x ? 4 : 2; return screen->is_nv4x ? 4 : 2;
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 1; return 1;
case PIPE_CAP_TIMER_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP: case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1; return 1;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:

View File

@@ -115,6 +115,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
return 1; return 1;
/* Unsupported features (boolean caps). */ /* Unsupported features (boolean caps). */
case PIPE_CAP_TIMER_QUERY:
case PIPE_CAP_DUAL_SOURCE_BLEND: case PIPE_CAP_DUAL_SOURCE_BLEND:
case PIPE_CAP_TGSI_CONT_SUPPORTED: case PIPE_CAP_TGSI_CONT_SUPPORTED:
case PIPE_CAP_INDEP_BLEND_ENABLE: case PIPE_CAP_INDEP_BLEND_ENABLE:

View File

@@ -30,6 +30,7 @@
*/ */
#include "draw/draw_context.h" #include "draw/draw_context.h"
#include "os/os_time.h"
#include "pipe/p_defines.h" #include "pipe/p_defines.h"
#include "util/u_memory.h" #include "util/u_memory.h"
#include "sp_context.h" #include "sp_context.h"
@@ -37,6 +38,7 @@
#include "sp_state.h" #include "sp_state.h"
struct softpipe_query { struct softpipe_query {
unsigned type;
uint64_t start; uint64_t start;
uint64_t end; uint64_t end;
}; };
@@ -51,8 +53,13 @@ static struct pipe_query *
softpipe_create_query(struct pipe_context *pipe, softpipe_create_query(struct pipe_context *pipe,
unsigned type) unsigned type)
{ {
assert(type == PIPE_QUERY_OCCLUSION_COUNTER); struct softpipe_query* sq;
return (struct pipe_query *)CALLOC_STRUCT( softpipe_query );
assert(type == PIPE_QUERY_OCCLUSION_COUNTER || type == PIPE_QUERY_TIME_ELAPSED);
sq = CALLOC_STRUCT( softpipe_query );
sq->type = type;
return (struct pipe_query *)sq;
} }
@@ -69,7 +76,17 @@ softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
struct softpipe_context *softpipe = softpipe_context( pipe ); struct softpipe_context *softpipe = softpipe_context( pipe );
struct softpipe_query *sq = softpipe_query(q); struct softpipe_query *sq = softpipe_query(q);
sq->start = softpipe->occlusion_count; switch (sq->type) {
case PIPE_QUERY_OCCLUSION_COUNTER:
sq->start = softpipe->occlusion_count;
break;
case PIPE_QUERY_TIME_ELAPSED:
sq->start = 1000*os_time_get();
break;
default:
assert(0);
break;
}
softpipe->active_query_count++; softpipe->active_query_count++;
softpipe->dirty |= SP_NEW_QUERY; softpipe->dirty |= SP_NEW_QUERY;
} }
@@ -82,7 +99,17 @@ softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
struct softpipe_query *sq = softpipe_query(q); struct softpipe_query *sq = softpipe_query(q);
softpipe->active_query_count--; softpipe->active_query_count--;
sq->end = softpipe->occlusion_count; switch (sq->type) {
case PIPE_QUERY_OCCLUSION_COUNTER:
sq->end = softpipe->occlusion_count;
break;
case PIPE_QUERY_TIME_ELAPSED:
sq->end = 1000*os_time_get();
break;
default:
assert(0);
break;
}
softpipe->dirty |= SP_NEW_QUERY; softpipe->dirty |= SP_NEW_QUERY;
} }

View File

@@ -82,6 +82,8 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
return PIPE_MAX_COLOR_BUFS; return PIPE_MAX_COLOR_BUFS;
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 1; return 1;
case PIPE_CAP_TIMER_QUERY:
return 1;
case PIPE_CAP_TEXTURE_MIRROR_CLAMP: case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
return 1; return 1;
case PIPE_CAP_TEXTURE_MIRROR_REPEAT: case PIPE_CAP_TEXTURE_MIRROR_REPEAT:

View File

@@ -134,6 +134,8 @@ svga_get_paramf(struct pipe_screen *screen, enum pipe_cap param)
return MIN2(result.u, PIPE_MAX_COLOR_BUFS); return MIN2(result.u, PIPE_MAX_COLOR_BUFS);
case PIPE_CAP_OCCLUSION_QUERY: case PIPE_CAP_OCCLUSION_QUERY:
return 1; return 1;
case PIPE_CAP_TIMER_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP: case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1; return 1;

View File

@@ -379,7 +379,8 @@ enum pipe_transfer_usage {
#define PIPE_QUERY_OCCLUSION_COUNTER 0 #define PIPE_QUERY_OCCLUSION_COUNTER 0
#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_TYPES 3 #define PIPE_QUERY_TIME_ELAPSED 3
#define PIPE_QUERY_TYPES 4
/** /**
@@ -423,6 +424,7 @@ enum pipe_cap {
PIPE_CAP_POINT_SPRITE, PIPE_CAP_POINT_SPRITE,
PIPE_CAP_MAX_RENDER_TARGETS, PIPE_CAP_MAX_RENDER_TARGETS,
PIPE_CAP_OCCLUSION_QUERY, PIPE_CAP_OCCLUSION_QUERY,
PIPE_CAP_TIMER_QUERY,
PIPE_CAP_TEXTURE_SHADOW_MAP, PIPE_CAP_TEXTURE_SHADOW_MAP,
PIPE_CAP_MAX_TEXTURE_2D_LEVELS, PIPE_CAP_MAX_TEXTURE_2D_LEVELS,
PIPE_CAP_MAX_TEXTURE_3D_LEVELS, PIPE_CAP_MAX_TEXTURE_3D_LEVELS,

View File

@@ -94,6 +94,9 @@ st_BeginQuery(GLcontext *ctx, struct gl_query_object *q)
case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
type = PIPE_QUERY_PRIMITIVES_EMITTED; type = PIPE_QUERY_PRIMITIVES_EMITTED;
break; break;
case GL_TIME_ELAPSED_EXT:
type = PIPE_QUERY_TIME_ELAPSED;
break;
default: default:
assert(0 && "unexpected query target in st_BeginQuery()"); assert(0 && "unexpected query target in st_BeginQuery()");
return; return;

View File

@@ -296,6 +296,9 @@ void st_init_extensions(struct st_context *st)
if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) { if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) {
ctx->Extensions.ARB_occlusion_query = GL_TRUE; ctx->Extensions.ARB_occlusion_query = GL_TRUE;
} }
if (screen->get_param(screen, PIPE_CAP_TIMER_QUERY)) {
ctx->Extensions.EXT_timer_query = GL_TRUE;
}
if (screen->get_param(screen, PIPE_CAP_TEXTURE_SHADOW_MAP)) { if (screen->get_param(screen, PIPE_CAP_TEXTURE_SHADOW_MAP)) {
ctx->Extensions.ARB_depth_texture = GL_TRUE; ctx->Extensions.ARB_depth_texture = GL_TRUE;