diff options
Diffstat (limited to 'src/mesa/main/context.c')
-rw-r--r-- | src/mesa/main/context.c | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 69d0a0320d..0d756de63e 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1,4 +1,4 @@ -/* $Id: context.c,v 1.26 1999/12/04 21:23:17 brianp Exp $ */ +/* $Id: context.c,v 1.27 1999/12/10 19:09:21 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -1277,10 +1277,11 @@ GLcontext *gl_create_context( GLvisual *visual, /* Fill in some driver defaults now. */ +#if 0 ctx->Driver.AllocDepthBuffer = gl_alloc_depth_buffer; ctx->Driver.ReadDepthSpanFloat = gl_read_depth_span_float; ctx->Driver.ReadDepthSpanInt = gl_read_depth_span_int; - +#endif #ifdef PROFILE init_timings( ctx ); @@ -1427,18 +1428,47 @@ void gl_destroy_context( GLcontext *ctx ) * encapsulates the depth, stencil and accum buffers and related * parameters. * Input: visual - a GLvisual pointer + * softwareDepth - create/use a software depth buffer? + * softwareStencil - create/use a software stencil buffer? + * softwareAccum - create/use a software accum buffer? + * softwareAlpha - create/use a software alpha buffer? + * Return: pointer to new GLframebuffer struct or NULL if error. */ -GLframebuffer *gl_create_framebuffer( GLvisual *visual ) +GLframebuffer *gl_create_framebuffer( GLvisual *visual, + GLboolean softwareDepth, + GLboolean softwareStencil, + GLboolean softwareAccum, + GLboolean softwareAlpha ) { GLframebuffer *buffer; - buffer = (GLframebuffer *) CALLOC( sizeof(GLframebuffer) ); + buffer = CALLOC_STRUCT(gl_frame_buffer); if (!buffer) { return NULL; } + /* sanity checks */ + if (softwareDepth ) { + assert(visual->DepthBits > 0); + } + if (softwareStencil) { + assert(visual->StencilBits > 0); + } + if (softwareAccum) { + assert(visual->RGBAflag); + assert(visual->AccumBits > 0); + } + if (softwareAlpha) { + assert(visual->RGBAflag); + assert(visual->AlphaBits > 0); + } + buffer->Visual = visual; + buffer->UseSoftwareDepthBuffer = softwareDepth; + buffer->UseSoftwareStencilBuffer = softwareStencil; + buffer->UseSoftwareAccumBuffer = softwareAccum; + buffer->UseSoftwareAlphaBuffers = softwareAlpha; return buffer; } @@ -1694,15 +1724,15 @@ _mesa_ResizeBuffersMESA( void ) ctx->DrawBuffer->Height = buf_height; /* Reallocate other buffers if needed. */ - if (ctx->Visual->DepthBits>0) { + if (ctx->DrawBuffer->UseSoftwareDepthBuffer) { /* reallocate depth buffer */ - (*ctx->Driver.AllocDepthBuffer)( ctx ); + gl_alloc_depth_buffer( ctx ); } - if (ctx->Visual->StencilBits>0) { + if (ctx->DrawBuffer->UseSoftwareStencilBuffer) { /* reallocate stencil buffer */ gl_alloc_stencil_buffer( ctx ); } - if (ctx->Visual->AccumBits>0) { + if (ctx->DrawBuffer->UseSoftwareAccumBuffer) { /* reallocate accum buffer */ gl_alloc_accum_buffer( ctx ); } @@ -2197,31 +2227,6 @@ void gl_update_state( GLcontext *ctx ) ctx->DrawBuffer->Ymax = ctx->Scissor.Y + ctx->Scissor.Height - 1; } } - - /* The driver isn't managing the depth buffer. - */ - if (ctx->Driver.AllocDepthBuffer == gl_alloc_depth_buffer) - { - if (ctx->Depth.Mask) { - switch (ctx->Depth.Func) { - case GL_LESS: - ctx->Driver.DepthTestSpan = gl_depth_test_span_less; - ctx->Driver.DepthTestPixels = gl_depth_test_pixels_less; - break; - case GL_GREATER: - ctx->Driver.DepthTestSpan = gl_depth_test_span_greater; - ctx->Driver.DepthTestPixels = gl_depth_test_pixels_greater; - break; - default: - ctx->Driver.DepthTestSpan = gl_depth_test_span_generic; - ctx->Driver.DepthTestPixels = gl_depth_test_pixels_generic; - } - } - else { - ctx->Driver.DepthTestSpan = gl_depth_test_span_generic; - ctx->Driver.DepthTestPixels = gl_depth_test_pixels_generic; - } - } } if (ctx->NewState & NEW_LIGHTING) { |