diff options
author | Eric Anholt <anholt@FreeBSD.org> | 2005-10-27 20:26:24 +0000 |
---|---|---|
committer | Eric Anholt <anholt@FreeBSD.org> | 2005-10-27 20:26:24 +0000 |
commit | 215c4c3a9c989b3d0e7090177ab2fc3eeab0ddaa (patch) | |
tree | 4d358e322e350f176e5b0dfbc6c838403f7199fd /src/mesa/drivers/dri/r128/r128_screen.c | |
parent | 512c994b92126a7575bb3cc327da40710b43f52c (diff) |
Bug #1028: Add hardware-accelerated stencil support to r128. Testing with
stencilwrap reported many issues with various modes. Some of these were
complicated by the fact that spans are broken (Bug #1615), but some appear to be
real bugs. However, while spans remain broken, I found that visual results were
better by avoiding fallbacks rather than avoiding just a broken stencil
implementation. Note that this required changing the depth spans at 24+8bpp
into read-modify-write cycles. It would be nicer as a single write with
a mask, but the kernel span blits turn off masking.
Reviewed by: ajax
Diffstat (limited to 'src/mesa/drivers/dri/r128/r128_screen.c')
-rw-r--r-- | src/mesa/drivers/dri/r128/r128_screen.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/r128/r128_screen.c b/src/mesa/drivers/dri/r128/r128_screen.c index 5d1b6e42d6..c91f9fdbf7 100644 --- a/src/mesa/drivers/dri/r128/r128_screen.c +++ b/src/mesa/drivers/dri/r128/r128_screen.c @@ -271,6 +271,11 @@ r128CreateBuffer( __DRIscreenPrivate *driScrnPriv, return GL_FALSE; /* not implemented */ } else { + const GLboolean swDepth = GL_FALSE; + const GLboolean swAlpha = GL_FALSE; + const GLboolean swAccum = mesaVis->accumRedBits > 0; + const GLboolean swStencil = mesaVis->stencilBits > 0 && + mesaVis->depthBits != 24; struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis); { @@ -316,12 +321,23 @@ r128CreateBuffer( __DRIscreenPrivate *driScrnPriv, _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); } + if (mesaVis->stencilBits > 0 && !swStencil) { + driRenderbuffer *stencilRb + = driNewRenderbuffer(GL_STENCIL_INDEX8_EXT, + NULL, + screen->cpp, + screen->depthOffset, screen->depthPitch, + driDrawPriv); + r128SetSpanFunctions(stencilRb, mesaVis); + _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base); + } + _mesa_add_soft_renderbuffers(fb, GL_FALSE, /* color */ - GL_FALSE, /* depth */ - mesaVis->stencilBits > 0, - mesaVis->accumRedBits > 0, - GL_FALSE, /* alpha */ + swDepth, + swStencil, + swAccum, + swAlpha, GL_FALSE /* aux */); driDrawPriv->driverPrivate = (void *) fb; |