gallium: EXT_timer_query support.
Signed-off-by: Corbin Simpson <MostAwesomeDude@gmail.com>
This commit is contained in:

committed by
Corbin Simpson

parent
fea91ee22d
commit
cdbd5f4203
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
switch (sq->type) {
|
||||||
|
case PIPE_QUERY_OCCLUSION_COUNTER:
|
||||||
sq->start = softpipe->occlusion_count;
|
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--;
|
||||||
|
switch (sq->type) {
|
||||||
|
case PIPE_QUERY_OCCLUSION_COUNTER:
|
||||||
sq->end = softpipe->occlusion_count;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user