mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 22:58:31 +02:00
Added basic occlusion counting
This commit is contained in:
parent
676fcf0de2
commit
563479552e
10 changed files with 123 additions and 1 deletions
|
|
@ -30,6 +30,11 @@
|
|||
#include "queryobj.h"
|
||||
#include "mtypes.h"
|
||||
|
||||
#if 1 /*PIPE*/
|
||||
#include "pipe/p_context.h"
|
||||
#include "state_tracker/st_context.h"
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Allocate a new query object. This is a fallback routine called via
|
||||
|
|
@ -220,6 +225,10 @@ _mesa_BeginQueryARB(GLenum target, GLuint id)
|
|||
q->Result = 0;
|
||||
q->Ready = GL_FALSE;
|
||||
|
||||
#if 1 /*PIPE*/
|
||||
ctx->st->pipe->reset_occlusion_counter(ctx->st->pipe);
|
||||
#endif
|
||||
|
||||
if (target == GL_SAMPLES_PASSED_ARB) {
|
||||
ctx->Query.CurrentOcclusionObject = q;
|
||||
}
|
||||
|
|
@ -282,6 +291,12 @@ _mesa_EndQueryARB(GLenum target)
|
|||
/* if we're using software rendering/querying */
|
||||
q->Ready = GL_TRUE;
|
||||
}
|
||||
|
||||
#if 1 /*PIPE*/
|
||||
if (target == GL_SAMPLES_PASSED_ARB) {
|
||||
q->Result = ctx->st->pipe->get_occlusion_counter(ctx->st->pipe);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,9 @@
|
|||
#ifndef PIPE_CONTEXT_H
|
||||
#define PIPE_CONTEXT_H
|
||||
|
||||
#include "mtypes.h"
|
||||
#include "main/mtypes.h"
|
||||
#include "p_state.h"
|
||||
|
||||
|
||||
/* Kludge:
|
||||
*/
|
||||
|
|
@ -57,6 +59,12 @@ struct pipe_context {
|
|||
void (*clear)(struct pipe_context *pipe, GLboolean color, GLboolean depth,
|
||||
GLboolean stencil, GLboolean accum);
|
||||
|
||||
/** occlusion counting (XXX this may be temporary - we should probably
|
||||
* have generic query objects with begin/end methods)
|
||||
*/
|
||||
void (*reset_occlusion_counter)(struct pipe_context *pipe);
|
||||
GLuint (*get_occlusion_counter)(struct pipe_context *pipe);
|
||||
|
||||
/*
|
||||
* State functions
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -136,6 +136,7 @@ struct pipe_depth_state
|
|||
GLuint enabled:1; /**< depth test enabled? */
|
||||
GLuint writemask:1; /**< allow depth buffer writes? */
|
||||
GLuint func:3; /**< depth test func (PIPE_FUNC_x) */
|
||||
GLuint occlusion_count:1; /**< XXX move this elsewhere? */
|
||||
GLfloat clear; /**< Clear value in [0,1] (XXX correct place?) */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,20 @@ static void softpipe_draw_vb( struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
static void softpipe_reset_occlusion_counter(struct pipe_context *pipe)
|
||||
{
|
||||
struct softpipe_context *softpipe = softpipe_context( pipe );
|
||||
softpipe->occlusion_counter = 0;
|
||||
}
|
||||
|
||||
/* XXX pipe param should be const */
|
||||
static GLuint softpipe_get_occlusion_counter(struct pipe_context *pipe)
|
||||
{
|
||||
struct softpipe_context *softpipe = softpipe_context( pipe );
|
||||
return softpipe->occlusion_counter;
|
||||
}
|
||||
|
||||
|
||||
struct pipe_context *softpipe_create( void )
|
||||
{
|
||||
struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);
|
||||
|
|
@ -82,12 +96,15 @@ struct pipe_context *softpipe_create( void )
|
|||
softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;
|
||||
softpipe->pipe.draw_vb = softpipe_draw_vb;
|
||||
softpipe->pipe.clear = softpipe_clear;
|
||||
softpipe->pipe.reset_occlusion_counter = softpipe_reset_occlusion_counter;
|
||||
softpipe->pipe.get_occlusion_counter = softpipe_get_occlusion_counter;
|
||||
|
||||
softpipe->quad.polygon_stipple = sp_quad_polygon_stipple_stage(softpipe);
|
||||
softpipe->quad.shade = sp_quad_shade_stage(softpipe);
|
||||
softpipe->quad.alpha_test = sp_quad_alpha_test_stage(softpipe);
|
||||
softpipe->quad.depth_test = sp_quad_depth_test_stage(softpipe);
|
||||
softpipe->quad.stencil_test = sp_quad_stencil_test_stage(softpipe);
|
||||
softpipe->quad.occlusion = sp_quad_occlusion_stage(softpipe);
|
||||
softpipe->quad.bufloop = sp_quad_bufloop_stage(softpipe);
|
||||
softpipe->quad.blend = sp_quad_blend_stage(softpipe);
|
||||
softpipe->quad.colormask = sp_quad_colormask_stage(softpipe);
|
||||
|
|
|
|||
|
|
@ -115,6 +115,8 @@ struct softpipe_context {
|
|||
*/
|
||||
GLubyte stipple_masks[16][16];
|
||||
|
||||
GLuint occlusion_counter;
|
||||
|
||||
/** Software quad rendering pipeline */
|
||||
struct {
|
||||
struct quad_stage *polygon_stipple;
|
||||
|
|
@ -122,6 +124,7 @@ struct softpipe_context {
|
|||
struct quad_stage *alpha_test;
|
||||
struct quad_stage *stencil_test;
|
||||
struct quad_stage *depth_test;
|
||||
struct quad_stage *occlusion;
|
||||
struct quad_stage *bufloop;
|
||||
struct quad_stage *blend;
|
||||
struct quad_stage *colormask;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,11 @@ sp_build_quad_pipeline(struct softpipe_context *sp)
|
|||
sp->quad.first = sp->quad.bufloop;
|
||||
}
|
||||
|
||||
if (sp->depth_test.occlusion_count) {
|
||||
sp->quad.occlusion->next = sp->quad.first;
|
||||
sp->quad.first = sp->quad.occlusion;
|
||||
}
|
||||
|
||||
if ( sp->stencil.front_enabled
|
||||
|| sp->stencil.front_enabled) {
|
||||
sp->quad.stencil_test->next = sp->quad.first;
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ struct quad_stage *sp_quad_shade_stage( struct softpipe_context *softpipe );
|
|||
struct quad_stage *sp_quad_alpha_test_stage( struct softpipe_context *softpipe );
|
||||
struct quad_stage *sp_quad_stencil_test_stage( struct softpipe_context *softpipe );
|
||||
struct quad_stage *sp_quad_depth_test_stage( struct softpipe_context *softpipe );
|
||||
struct quad_stage *sp_quad_occlusion_stage( struct softpipe_context *softpipe );
|
||||
struct quad_stage *sp_quad_bufloop_stage( struct softpipe_context *softpipe );
|
||||
struct quad_stage *sp_quad_blend_stage( struct softpipe_context *softpipe );
|
||||
struct quad_stage *sp_quad_colormask_stage( struct softpipe_context *softpipe );
|
||||
|
|
|
|||
67
src/mesa/pipe/softpipe/sp_quad_occlusion.c
Normal file
67
src/mesa/pipe/softpipe/sp_quad_occlusion.c
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
/**
|
||||
* \brief Quad occlusion counter stage
|
||||
* \author Brian Paul
|
||||
*/
|
||||
|
||||
|
||||
#include "main/glheader.h"
|
||||
#include "main/imports.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "sp_context.h"
|
||||
#include "sp_headers.h"
|
||||
#include "sp_surface.h"
|
||||
#include "sp_quad.h"
|
||||
|
||||
|
||||
static void
|
||||
occlusion_count_quad(struct quad_stage *qs, struct quad_header *quad)
|
||||
{
|
||||
struct softpipe_context *softpipe = qs->softpipe;
|
||||
|
||||
softpipe->occlusion_counter += (quad->mask ) & 1;
|
||||
softpipe->occlusion_counter += (quad->mask >> 1) & 1;
|
||||
softpipe->occlusion_counter += (quad->mask >> 2) & 1;
|
||||
softpipe->occlusion_counter += (quad->mask >> 3) & 1;
|
||||
|
||||
if (quad->mask)
|
||||
qs->next->run(qs->next, quad);
|
||||
}
|
||||
|
||||
|
||||
struct quad_stage *sp_quad_occlusion_stage( struct softpipe_context *softpipe )
|
||||
{
|
||||
struct quad_stage *stage = CALLOC_STRUCT(quad_stage);
|
||||
|
||||
stage->softpipe = softpipe;
|
||||
stage->run = occlusion_count_quad;
|
||||
|
||||
return stage;
|
||||
}
|
||||
|
|
@ -164,6 +164,7 @@ SOFTPIPE_SOURCES = \
|
|||
pipe/softpipe/sp_quad_colormask.c \
|
||||
pipe/softpipe/sp_quad_depth_test.c \
|
||||
pipe/softpipe/sp_quad_fs.c \
|
||||
pipe/softpipe/sp_quad_occlusion.c \
|
||||
pipe/softpipe/sp_quad_output.c \
|
||||
pipe/softpipe/sp_quad_stipple.c \
|
||||
pipe/softpipe/sp_quad_stencil.c \
|
||||
|
|
|
|||
|
|
@ -71,6 +71,10 @@ update_depth( struct st_context *st )
|
|||
depth.func = gl_depth_func_to_sp(st->ctx->Depth.Func);
|
||||
depth.clear = st->ctx->Depth.Clear;
|
||||
|
||||
if (st->ctx->Query.CurrentOcclusionObject &&
|
||||
st->ctx->Query.CurrentOcclusionObject->Active)
|
||||
depth.occlusion_count = 1;
|
||||
|
||||
if (memcmp(&depth, &st->state.depth, sizeof(depth)) != 0) {
|
||||
/* state has changed */
|
||||
st->state.depth = depth; /* struct copy */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue