From 7e67fb41fb54e050f6983b4de09ed3a317d6148f Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 4 Apr 2000 15:14:10 +0000 Subject: [PATCH] more GL_HP_occlusion_test work --- src/mesa/drivers/osmesa/osmesa.c | 271 +++---------------------------- src/mesa/main/context.c | 3 +- src/mesa/main/enable.c | 6 +- src/mesa/main/get.c | 38 ++++- 4 files changed, 63 insertions(+), 255 deletions(-) diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c index 04d5de4731b..9a7ef250a37 100644 --- a/src/mesa/drivers/osmesa/osmesa.c +++ b/src/mesa/drivers/osmesa/osmesa.c @@ -1,4 +1,4 @@ -/* $Id: osmesa.c,v 1.14 2000/04/04 00:54:23 brianp Exp $ */ +/* $Id: osmesa.c,v 1.15 2000/04/04 15:14:10 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -474,8 +474,9 @@ void GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value ) * buffer - pointer to depth buffer values * Return: GL_TRUE or GL_FALSE to indicate success or failure. */ -GLboolean GLAPIENTRY OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, - GLint *bytesPerValue, void **buffer ) +GLboolean GLAPIENTRY +OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, + GLint *bytesPerValue, void **buffer ) { if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) { *width = 0; @@ -501,8 +502,9 @@ GLboolean GLAPIENTRY OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint * buffer - pointer to color buffer values * Return: GL_TRUE or GL_FALSE to indicate success or failure. */ -GLboolean GLAPIENTRY OSMesaGetColorBuffer( OSMesaContext c, GLint *width, - GLint *height, GLint *format, void **buffer ) +GLboolean GLAPIENTRY +OSMesaGetColorBuffer( OSMesaContext c, GLint *width, + GLint *height, GLint *format, void **buffer ) { if (!c->buffer) { *width = 0; @@ -510,7 +512,8 @@ GLboolean GLAPIENTRY OSMesaGetColorBuffer( OSMesaContext c, GLint *width, *format = 0; *buffer = 0; return GL_FALSE; - } else { + } + else { *width = c->width; *height = c->height; *format = c->format; @@ -961,8 +964,6 @@ static void write_monocolor_span3( const GLcontext *ctx, GLint rind = osmesa->rind; GLint gind = osmesa->gind; GLint bind = osmesa->bind; - - GLubyte *ptr3 = PIXELADDR3( x, y); GLuint i; for (i=0;irind; GLint gind = osmesa->gind; GLint bind = osmesa->bind; - GLubyte *ptr3 = PIXELADDR3( x, y); + const GLubyte *ptr3 = PIXELADDR3( x, y); for (i=0;ibind; for (i=0;i> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\ pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\ pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\ - *ptr4 = pixel; \ + *ptr4 = pixel; \ } #ifdef WIN32 @@ -1288,14 +1289,14 @@ static void flat_blend_rgba_z_line( GLcontext *ctx, #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define CLIP_HACK 1 -#define PLOT(X,Y) \ - if (Z < *zPtr) { \ - GLuint *ptr4 = PIXELADDR4(X,Y); \ - GLuint pixel = 0; \ +#define PLOT(X,Y) \ + if (Z < *zPtr) { \ + GLuint *ptr4 = PIXELADDR4(X,Y); \ + GLuint pixel = 0; \ pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ - *ptr4 = pixel; \ + *ptr4 = pixel; \ } #ifdef WIN32 @@ -1327,15 +1328,15 @@ static void flat_blend_rgba_z_line_write( GLcontext *ctx, #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define CLIP_HACK 1 -#define PLOT(X,Y) \ - if (Z < *zPtr) { \ - GLuint *ptr4 = PIXELADDR4(X,Y); \ - GLuint pixel = 0; \ +#define PLOT(X,Y) \ + if (Z < *zPtr) { \ + GLuint *ptr4 = PIXELADDR4(X,Y); \ + GLuint pixel = 0; \ pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ - *ptr4 = pixel; \ - *zPtr = Z; \ + *ptr4 = pixel; \ + *zPtr = Z; \ } #ifdef WIN32 @@ -1560,180 +1561,6 @@ static triangle_func choose_triangle_function( GLcontext *ctx ) -/**********************************************************************/ -/***** Occlusion rendering routines *****/ -/**********************************************************************/ - -#define OCC_STD_MASK_TEST \ - if (ctx->OcclusionResult) return; \ - if (mask) { \ - GLuint i; \ - for (i=0;iOcclusionResult = GL_TRUE; \ - return; \ - } \ - } else { \ - ((GLcontext *)ctx)->OcclusionResult = GL_TRUE; \ - } \ - return; - -/** -*** Color Index -**/ - -static void write_index32_span_occ( const GLcontext *ctx, - GLuint n, GLint x, GLint y, - const GLuint index[], const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_index8_span_occ( const GLcontext *ctx, - GLuint n, GLint x, GLint y, - const GLubyte index[], const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_monoindex_span_occ( const GLcontext *ctx, - GLuint n, GLint x, GLint y, - const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_index_pixels_occ( const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - const GLuint index[], const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_monoindex_pixels_occ( const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - -/** -*** RGB/RGBA -**/ -static void write_rgba_span_occ( const GLcontext *ctx, - GLuint n, GLint x, GLint y, - CONST GLubyte rgba[][4], const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_rgb_span_occ( const GLcontext *ctx, - GLuint n, GLint x, GLint y, - CONST GLubyte rgb[][3], - const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_rgba_pixels_occ( const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - CONST GLubyte rgba[][4], const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_monocolor_span_occ( const GLcontext *ctx, - GLuint n, GLint x, GLint y, - const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -static void write_monocolor_pixels_occ( const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - const GLubyte mask[] ) -{ - OCC_STD_MASK_TEST -} - - -/** -*** Line Drawing -**/ -static void line_occ( GLcontext *ctx, - GLuint vert0, GLuint vert1, GLuint pvert ) -{ - ctx->OcclusionResult = GL_TRUE; -} - - -static void line_z_occ( GLcontext *ctx, - GLuint vert0, GLuint vert1, GLuint pvert ) -{ - if (ctx->OcclusionResult) return; - -#define INTERP_XY 1 -#define INTERP_Z 1 -#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define CLIP_HACK 1 -#define PLOT(X,Y) \ - if (Z < *zPtr) { \ - ctx->OcclusionResult = GL_TRUE; \ - return; \ - } - -#ifdef WIN32 -#include "..\linetemp.h" -#else -#include "linetemp.h" -#endif -} - - -/** -*** Triangle Drawing -**/ -static void triangle_occ( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint pv ) -{ - ctx->OcclusionResult = GL_TRUE; -} - - -static void triangle_z_occ( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint pv ) -{ - if (ctx->OcclusionResult) return; - -#define INTERP_Z 1 -#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define INNER_LOOP( LEFT, RIGHT, Y ) \ -{ \ - GLint i, len = RIGHT-LEFT; \ - for (i=0;iOcclusionResult = GL_TRUE; \ - return; \ - } \ - ffz += fdzdx; \ - } \ -} -#ifdef WIN32 -#include "..\tritemp.h" -#else -#include "tritemp.h" -#endif -} - - static const GLubyte *get_string( GLcontext *ctx, GLenum name ) { (void) ctx; @@ -1808,48 +1635,4 @@ static void osmesa_update_state( GLcontext *ctx ) ctx->Driver.WriteMonoCIPixels = write_monoindex_pixels; ctx->Driver.ReadCI32Span = read_index_span; ctx->Driver.ReadCI32Pixels = read_index_pixels; - - /* Occlusion test cases: - * If no buffers have been selected for writing, - * we swap in occlusion routines that: - * (1) check the current flag and return if set - * (2) set the flag if any pixel would be updated - * Note: all the other buffer writing routines will - * always set the visible flag so in cases of "improper" - * extension use will just cause unnecessary rasterization - * to occur. The image will be correct in any case. - */ - if ((ctx->Depth.OcclusionTest) && - (((!ctx->Visual->RGBAflag) && - (ctx->Color.IndexMask == 0)) || - ((ctx->Visual->RGBAflag) && - (ctx->Color.ColorMask[0] == 0) && - (ctx->Color.ColorMask[1] == 0) && - (ctx->Color.ColorMask[2] == 0) && - (ctx->Color.ColorMask[3] == 0))) && - (ctx->Depth.Func == GL_LESS) && - (ctx->Stencil.Enabled == GL_FALSE)) { - - ctx->Driver.WriteCI32Span = write_index32_span_occ; - ctx->Driver.WriteCI8Span = write_index8_span_occ; - ctx->Driver.WriteMonoCISpan = write_monoindex_span_occ; - ctx->Driver.WriteCI32Pixels = write_index_pixels_occ; - ctx->Driver.WriteMonoCIPixels = write_monoindex_pixels_occ; - - ctx->Driver.WriteRGBASpan = write_rgba_span_occ; - ctx->Driver.WriteRGBSpan = write_rgb_span_occ; - ctx->Driver.WriteRGBAPixels = write_rgba_pixels_occ; - ctx->Driver.WriteMonoRGBASpan = write_monocolor_span_occ; - ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels_occ; - - if (ctx->RasterMask & DEPTH_BIT) { - ctx->Driver.LineFunc = line_z_occ; - ctx->Driver.TriangleFunc = triangle_z_occ; - } else { - ctx->Driver.LineFunc = line_occ; - ctx->Driver.TriangleFunc = triangle_occ; - } - } else { - ctx->OcclusionResult = GL_TRUE; - } } diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 92077533126..ca95e430c0b 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1,4 +1,4 @@ -/* $Id: context.c,v 1.52 2000/03/31 01:05:51 brianp Exp $ */ +/* $Id: context.c,v 1.53 2000/04/04 15:14:10 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -1276,6 +1276,7 @@ static void init_attrib_groups( GLcontext *ctx ) ctx->CatchSignals = GL_TRUE; ctx->OcclusionResult = GL_FALSE; + ctx->OcclusionResultSaved = GL_FALSE; /* For debug/development only */ ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE; diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index 0e1a5781bdd..fa0c84f1731 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -1,4 +1,4 @@ -/* $Id: enable.c,v 1.12 2000/03/11 23:23:26 brianp Exp $ */ +/* $Id: enable.c,v 1.13 2000/04/04 15:14:10 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -455,6 +455,10 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state ) case GL_OCCLUSION_TEST_HP: if (ctx->Extensions.HaveHpOcclusionTest) { ctx->Depth.OcclusionTest = state; + if (state) + ctx->OcclusionResult = ctx->OcclusionResultSaved; + else + ctx->OcclusionResultSaved = ctx->OcclusionResult; ctx->NewState |= NEW_RASTER_OPS; } else { diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 136d89689aa..2552f305191 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -1,4 +1,4 @@ -/* $Id: get.c,v 1.16 2000/03/31 01:04:52 brianp Exp $ */ +/* $Id: get.c,v 1.17 2000/04/04 15:14:10 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -1029,8 +1029,13 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params ) return; case GL_OCCLUSION_TEST_RESULT_HP: if (ctx->Extensions.HaveHpOcclusionTest) { - *params = ctx->OcclusionResult; - ctx->OcclusionResult = GL_FALSE; /* reset now */ + if (ctx->Depth.OcclusionTest) + *params = ctx->OcclusionResult; + else + *params = ctx->OcclusionResultSaved; + /* reset flag now */ + ctx->OcclusionResult = GL_FALSE; + ctx->OcclusionResultSaved = GL_FALSE; } else { gl_error( ctx, GL_INVALID_ENUM, "glGetBooleanv" ); @@ -2016,8 +2021,13 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params ) return; case GL_OCCLUSION_TEST_RESULT_HP: if (ctx->Extensions.HaveHpOcclusionTest) { - *params = (GLdouble) ctx->OcclusionResult; - ctx->OcclusionResult = GL_FALSE; /* reset now */ + if (ctx->Depth.OcclusionTest) + *params = (GLdouble) ctx->OcclusionResult; + else + *params = (GLdouble) ctx->OcclusionResultSaved; + /* reset flag now */ + ctx->OcclusionResult = GL_FALSE; + ctx->OcclusionResultSaved = GL_FALSE; } else { gl_error( ctx, GL_INVALID_ENUM, "glGetDoublev" ); @@ -2980,8 +2990,13 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params ) return; case GL_OCCLUSION_TEST_RESULT_HP: if (ctx->Extensions.HaveHpOcclusionTest) { - *params = (GLfloat) ctx->OcclusionResult; - ctx->OcclusionResult = GL_FALSE; /* reset now */ + if (ctx->Depth.OcclusionTest) + *params = (GLfloat) ctx->OcclusionResult; + else + *params = (GLfloat) ctx->OcclusionResultSaved; + /* reset flag now */ + ctx->OcclusionResult = GL_FALSE; + ctx->OcclusionResultSaved = GL_FALSE; } else { gl_error( ctx, GL_INVALID_ENUM, "glGetFloatv" ); @@ -3967,8 +3982,13 @@ _mesa_GetIntegerv( GLenum pname, GLint *params ) return; case GL_OCCLUSION_TEST_RESULT_HP: if (ctx->Extensions.HaveHpOcclusionTest) { - *params = (GLint) ctx->OcclusionResult; - ctx->OcclusionResult = GL_FALSE; /* reset now */ + if (ctx->Depth.OcclusionTest) + *params = (GLint) ctx->OcclusionResult; + else + *params = (GLint) ctx->OcclusionResultSaved; + /* reset flag now */ + ctx->OcclusionResult = GL_FALSE; + ctx->OcclusionResultSaved = GL_FALSE; } else { gl_error( ctx, GL_INVALID_ENUM, "glGetIntegerv" ); -- 2.30.2