softpipe: implement conditional rendering
This commit is contained in:
@@ -36,6 +36,7 @@
|
|||||||
#include "util/u_pack_color.h"
|
#include "util/u_pack_color.h"
|
||||||
#include "sp_clear.h"
|
#include "sp_clear.h"
|
||||||
#include "sp_context.h"
|
#include "sp_context.h"
|
||||||
|
#include "sp_query.h"
|
||||||
#include "sp_tile_cache.h"
|
#include "sp_tile_cache.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -55,6 +56,9 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba,
|
|||||||
if (softpipe->no_rast)
|
if (softpipe->no_rast)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!softpipe_check_render_cond(softpipe))
|
||||||
|
return;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
softpipe_update_derived(softpipe); /* not needed?? */
|
softpipe_update_derived(softpipe); /* not needed?? */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -176,6 +176,19 @@ softpipe_is_buffer_referenced( struct pipe_context *pipe,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
softpipe_render_condition( struct pipe_context *pipe,
|
||||||
|
struct pipe_query *query,
|
||||||
|
uint mode )
|
||||||
|
{
|
||||||
|
struct softpipe_context *softpipe = softpipe_context( pipe );
|
||||||
|
|
||||||
|
softpipe->render_cond_query = query;
|
||||||
|
softpipe->render_cond_mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct pipe_context *
|
struct pipe_context *
|
||||||
softpipe_create( struct pipe_screen *screen )
|
softpipe_create( struct pipe_screen *screen )
|
||||||
{
|
{
|
||||||
@@ -252,6 +265,8 @@ softpipe_create( struct pipe_screen *screen )
|
|||||||
|
|
||||||
softpipe_init_query_funcs( softpipe );
|
softpipe_init_query_funcs( softpipe );
|
||||||
|
|
||||||
|
softpipe->pipe.render_condition = softpipe_render_condition;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alloc caches for accessing drawing surfaces and textures.
|
* Alloc caches for accessing drawing surfaces and textures.
|
||||||
* Must be before quad stage setup!
|
* Must be before quad stage setup!
|
||||||
|
|||||||
@@ -116,6 +116,10 @@ struct softpipe_context {
|
|||||||
|
|
||||||
unsigned line_stipple_counter;
|
unsigned line_stipple_counter;
|
||||||
|
|
||||||
|
/** Conditional query object and mode */
|
||||||
|
struct pipe_query *render_cond_query;
|
||||||
|
uint render_cond_mode;
|
||||||
|
|
||||||
/** Software quad rendering pipeline */
|
/** Software quad rendering pipeline */
|
||||||
struct {
|
struct {
|
||||||
struct quad_stage *shade;
|
struct quad_stage *shade;
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
#include "util/u_prim.h"
|
#include "util/u_prim.h"
|
||||||
|
|
||||||
#include "sp_context.h"
|
#include "sp_context.h"
|
||||||
|
#include "sp_query.h"
|
||||||
#include "sp_state.h"
|
#include "sp_state.h"
|
||||||
|
|
||||||
#include "draw/draw_context.h"
|
#include "draw/draw_context.h"
|
||||||
@@ -122,6 +123,9 @@ softpipe_draw_range_elements(struct pipe_context *pipe,
|
|||||||
struct draw_context *draw = sp->draw;
|
struct draw_context *draw = sp->draw;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
if (!softpipe_check_render_cond(sp))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
sp->reduced_api_prim = u_reduced_prim(mode);
|
sp->reduced_api_prim = u_reduced_prim(mode);
|
||||||
|
|
||||||
if (sp->dirty)
|
if (sp->dirty)
|
||||||
|
|||||||
@@ -99,6 +99,32 @@ softpipe_get_query_result(struct pipe_context *pipe,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by rendering function to check rendering is conditional.
|
||||||
|
* \return TRUE if we should render, FALSE if we should skip rendering
|
||||||
|
*/
|
||||||
|
boolean
|
||||||
|
softpipe_check_render_cond(struct softpipe_context *sp)
|
||||||
|
{
|
||||||
|
struct pipe_context *pipe = &sp->pipe;
|
||||||
|
boolean b, wait;
|
||||||
|
uint64_t result;
|
||||||
|
|
||||||
|
if (!sp->render_cond_query) {
|
||||||
|
return TRUE; /* no query predicate, draw normally */
|
||||||
|
}
|
||||||
|
|
||||||
|
wait = (sp->render_cond_mode == PIPE_RENDER_COND_WAIT ||
|
||||||
|
sp->render_cond_mode == PIPE_RENDER_COND_BY_REGION_WAIT);
|
||||||
|
|
||||||
|
b = pipe->get_query_result(pipe, sp->render_cond_query, wait, &result);
|
||||||
|
if (b)
|
||||||
|
return result > 0;
|
||||||
|
else
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void softpipe_init_query_funcs(struct softpipe_context *softpipe )
|
void softpipe_init_query_funcs(struct softpipe_context *softpipe )
|
||||||
{
|
{
|
||||||
softpipe->pipe.create_query = softpipe_create_query;
|
softpipe->pipe.create_query = softpipe_create_query;
|
||||||
|
|||||||
@@ -32,6 +32,10 @@
|
|||||||
#ifndef SP_QUERY_H
|
#ifndef SP_QUERY_H
|
||||||
#define SP_QUERY_H
|
#define SP_QUERY_H
|
||||||
|
|
||||||
|
extern boolean
|
||||||
|
softpipe_check_render_cond(struct softpipe_context *sp);
|
||||||
|
|
||||||
|
|
||||||
struct softpipe_context;
|
struct softpipe_context;
|
||||||
extern void softpipe_init_query_funcs(struct softpipe_context * );
|
extern void softpipe_init_query_funcs(struct softpipe_context * );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user