summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@fedoraproject.org>2009-03-31 06:07:01 +0000
committerDave Airlie <airlied@fedoraproject.org>2009-03-31 06:07:01 +0000
commit79ee3234789aad136c61af85dc2b0f63fd87cb8c (patch)
tree61d8918d5a44f239dc8568fd2d96247d0e384194
parent7b268cc6aef649c5700812b8a3c273de6345750d (diff)
downloadmesa-79ee3234789aad136c61af85dc2b0f63fd87cb8c.tar.gz
mesa-79ee3234789aad136c61af85dc2b0f63fd87cb8c.tar.xz
mesa-79ee3234789aad136c61af85dc2b0f63fd87cb8c.zip
- radeon-rewrite.patch: misc radeon fixes with buffer readbacksmesa-7_5-0_5_fc11
-rw-r--r--mesa.spec5
-rw-r--r--radeon-rewrite.patch449
2 files changed, 270 insertions, 184 deletions
diff --git a/mesa.spec b/mesa.spec
index a732bd7..6aa9ff0 100644
--- a/mesa.spec
+++ b/mesa.spec
@@ -20,7 +20,7 @@
Summary: Mesa graphics libraries
Name: mesa
Version: 7.5
-Release: 0.4%{?dist}
+Release: 0.5%{?dist}
License: MIT
Group: System Environment/Libraries
URL: http://www.mesa3d.org
@@ -429,6 +429,9 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/mesa-demos-data
%changelog
+* Tue Mar 31 2009 Dave Airlie <airlied@redhat.com> 7.5-0.5
+- radeon-rewrite.patch: misc radeon fixes with buffer readbacks
+
* Thu Mar 26 2009 Dave Airlie <airlied@redhat.com> 7.5-0.4
- fix r200 fbo + vram sizing bug
diff --git a/radeon-rewrite.patch b/radeon-rewrite.patch
index ec33607..112c42f 100644
--- a/radeon-rewrite.patch
+++ b/radeon-rewrite.patch
@@ -1898,7 +1898,7 @@ index d514b28..85c1b7b 100644
}
}
diff --git a/src/mesa/drivers/dri/r200/r200_ioctl.c b/src/mesa/drivers/dri/r200/r200_ioctl.c
-index 0741e57..b8e40da 100644
+index 0741e57..0262aea 100644
--- a/src/mesa/drivers/dri/r200/r200_ioctl.c
+++ b/src/mesa/drivers/dri/r200/r200_ioctl.c
@@ -41,6 +41,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -2160,7 +2160,8 @@ index 0741e57..b8e40da 100644
- struct r200_dma_region *region,
- int bytes,
- int alignment )
--{
++static void r200UserClear(GLcontext *ctx, GLuint mask)
+ {
- if (R200_DEBUG & DEBUG_IOCTL)
- fprintf(stderr, "%s %d\n", __FUNCTION__, bytes);
-
@@ -2189,8 +2190,9 @@ index 0741e57..b8e40da 100644
- rmesa->dma.current.ptr = (rmesa->dma.current.ptr + 0x7) & ~0x7;
-
- assert( rmesa->dma.current.ptr <= rmesa->dma.current.end );
--}
--
++ radeon_clear_tris(ctx, mask);
+ }
+
-/* ================================================================
- * SwapBuffers with client-side throttling
- */
@@ -2379,8 +2381,7 @@ index 0741e57..b8e40da 100644
-}
-
-void r200PageFlip( __DRIdrawablePrivate *dPriv )
-+static void r200UserClear(GLcontext *ctx, GLuint mask)
- {
+-{
- r200ContextPtr rmesa;
- GLint ret;
- GLboolean missed_target;
@@ -2465,9 +2466,8 @@ index 0741e57..b8e40da 100644
-
- r200UpdateDrawBuffer(rmesa->glCtx);
-#endif
-+ radeon_clear_tris(ctx, mask);
- }
-
+-}
+-
-
-/* ================================================================
- * Buffer clear
@@ -2506,7 +2506,10 @@ index 0741e57..b8e40da 100644
- color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
- mask &= ~BUFFER_BIT_BACK_LEFT;
- }
--
++ __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
++ GLint cx, cy, cw, ch, ret;
++ GLuint i;
+
- if ( mask & BUFFER_BIT_DEPTH ) {
- flags |= RADEON_DEPTH;
- mask &= ~BUFFER_BIT_DEPTH;
@@ -2525,10 +2528,7 @@ index 0741e57..b8e40da 100644
-
- if ( !flags )
- return;
-+ __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
-+ GLint cx, cy, cw, ch, ret;
-+ GLuint i;
-
+-
- if (rmesa->using_hyperz) {
- flags |= RADEON_USE_COMP_ZBUF;
-/* if (rmesa->r200Screen->chip_family == CHIP_FAMILY_R200)
@@ -2628,7 +2628,7 @@ index 0741e57..b8e40da 100644
for ( ; n >= 0 ; n-- ) {
depth_boxes[n].f[CLEAR_X1] = (float)b[n].x1;
depth_boxes[n].f[CLEAR_Y1] = (float)b[n].y1;
-@@ -774,83 +172,90 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask )
+@@ -774,84 +172,91 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask )
depth_boxes[n].f[CLEAR_DEPTH] = ctx->Depth.Clear;
}
@@ -2649,14 +2649,23 @@ index 0741e57..b8e40da 100644
- rmesa->hw.all_dirty = GL_TRUE;
+ UNLOCK_HARDWARE( &rmesa->radeon );
}
--
--
--void r200WaitForIdleLocked( r200ContextPtr rmesa )
+/* ================================================================
+ * Buffer clear
+ */
+static void r200Clear( GLcontext *ctx, GLbitfield mask )
- {
++{
++ r200ContextPtr rmesa = R200_CONTEXT(ctx);
++ __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
++ GLuint flags = 0;
++ GLuint color_mask = 0;
++ GLuint orig_mask = mask;
+
++ if ( R200_DEBUG & DEBUG_IOCTL ) {
++ fprintf( stderr, "r200Clear %x %d\n", mask, rmesa->radeon.sarea->pfCurrentPage);
++ }
+
+-void r200WaitForIdleLocked( r200ContextPtr rmesa )
+-{
- int ret;
- int i = 0;
-
@@ -2672,22 +2681,6 @@ index 0741e57..b8e40da 100644
- exit( -1 );
- }
-}
-+ r200ContextPtr rmesa = R200_CONTEXT(ctx);
-+ __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
-+ GLuint flags = 0;
-+ GLuint color_mask = 0;
-+ GLuint orig_mask = mask;
-
-+ if ( R200_DEBUG & DEBUG_IOCTL ) {
-+ fprintf( stderr, "r200Clear %x %d\n", mask, rmesa->radeon.sarea->pfCurrentPage);
-+ }
-
--static void r200WaitForIdle( r200ContextPtr rmesa )
--{
-- LOCK_HARDWARE(rmesa);
-- r200WaitForIdleLocked( rmesa );
-- UNLOCK_HARDWARE(rmesa);
--}
+ {
+ LOCK_HARDWARE( &rmesa->radeon );
+ UNLOCK_HARDWARE( &rmesa->radeon );
@@ -2697,61 +2690,62 @@ index 0741e57..b8e40da 100644
+ radeonFlush( ctx );
--void r200Flush( GLcontext *ctx )
+-static void r200WaitForIdle( r200ContextPtr rmesa )
-{
-- r200ContextPtr rmesa = R200_CONTEXT( ctx );
+- LOCK_HARDWARE(rmesa);
+- r200WaitForIdleLocked( rmesa );
+- UNLOCK_HARDWARE(rmesa);
+-}
+ if ( mask & BUFFER_BIT_FRONT_LEFT ) {
+ flags |= RADEON_FRONT;
+ color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
+ mask &= ~BUFFER_BIT_FRONT_LEFT;
+ }
-- if (R200_DEBUG & DEBUG_IOCTL)
-- fprintf(stderr, "%s\n", __FUNCTION__);
+ if ( mask & BUFFER_BIT_BACK_LEFT ) {
+ flags |= RADEON_BACK;
+ color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
+ mask &= ~BUFFER_BIT_BACK_LEFT;
+ }
-- if (rmesa->dma.flush)
-- rmesa->dma.flush( rmesa );
+-void r200Flush( GLcontext *ctx )
+-{
+- r200ContextPtr rmesa = R200_CONTEXT( ctx );
+ if ( mask & BUFFER_BIT_DEPTH ) {
+ flags |= RADEON_DEPTH;
+ mask &= ~BUFFER_BIT_DEPTH;
+ }
-- r200EmitState( rmesa );
--
-- if (rmesa->store.cmd_used)
-- r200FlushCmdBuf( rmesa, __FUNCTION__ );
--}
+- if (R200_DEBUG & DEBUG_IOCTL)
+- fprintf(stderr, "%s\n", __FUNCTION__);
+ if ( (mask & BUFFER_BIT_STENCIL) ) {
+ flags |= RADEON_STENCIL;
+ mask &= ~BUFFER_BIT_STENCIL;
+ }
--/* Make sure all commands have been sent to the hardware and have
-- * completed processing.
-- */
--void r200Finish( GLcontext *ctx )
--{
-- r200ContextPtr rmesa = R200_CONTEXT(ctx);
-- r200Flush( ctx );
+- if (rmesa->dma.flush)
+- rmesa->dma.flush( rmesa );
+ if ( mask ) {
+ if (R200_DEBUG & DEBUG_FALLBACKS)
+ fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask);
+ _swrast_Clear( ctx, mask );
+ }
-- if (rmesa->do_irqs) {
-- LOCK_HARDWARE( rmesa );
-- r200EmitIrqLocked( rmesa );
-- UNLOCK_HARDWARE( rmesa );
-- r200WaitIrq( rmesa );
+- r200EmitState( rmesa );
+-
+- if (rmesa->store.cmd_used)
+- r200FlushCmdBuf( rmesa, __FUNCTION__ );
+-}
+ if ( !flags )
+ return;
-+
+
+-/* Make sure all commands have been sent to the hardware and have
+- * completed processing.
+- */
+-void r200Finish( GLcontext *ctx )
+-{
+- r200ContextPtr rmesa = R200_CONTEXT(ctx);
+- r200Flush( ctx );
+ if (rmesa->using_hyperz) {
+ flags |= RADEON_USE_COMP_ZBUF;
+/* if (rmesa->radeon.radeonScreen->chip_family == CHIP_FAMILY_R200)
@@ -2760,21 +2754,27 @@ index 0741e57..b8e40da 100644
+ ((rmesa->radeon.state.stencil.clear & R200_STENCIL_WRITE_MASK) == R200_STENCIL_WRITE_MASK))) {
+ flags |= RADEON_CLEAR_FASTZ;
+ }
- }
-- else
-- r200WaitForIdle( rmesa );
--}
++ }
+- if (rmesa->do_irqs) {
+- LOCK_HARDWARE( rmesa );
+- r200EmitIrqLocked( rmesa );
+- UNLOCK_HARDWARE( rmesa );
+- r200WaitIrq( rmesa );
+ if (rmesa->radeon.radeonScreen->kernel_mm)
+ r200UserClear(ctx, orig_mask);
-+ else
++ else {
+ r200KernelClear(ctx, flags);
-+
-+ rmesa->radeon.hw.all_dirty = GL_TRUE;
-+}
++ rmesa->radeon.hw.all_dirty = GL_TRUE;
+ }
+- else
+- r200WaitForIdle( rmesa );
+ }
+-
/* This version of AllocateMemoryMESA allocates only GART memory, and
* only does so after the point at which the driver has been
+ * initialized.
@@ -875,7 +280,7 @@ void *r200AllocateMemoryMESA(__DRIscreen *screen, GLsizei size,
fprintf(stderr, "%s sz %d %f/%f/%f\n", __FUNCTION__, size, readfreq,
writefreq, priority);
@@ -5056,7 +5056,7 @@ index a917163..1dddbfd 100644
extern void r200LightingSpaceChange( GLcontext *ctx );
diff --git a/src/mesa/drivers/dri/r200/r200_state_init.c b/src/mesa/drivers/dri/r200/r200_state_init.c
-index 9e4677e..30326c2 100644
+index 9e4677e..2400abe 100644
--- a/src/mesa/drivers/dri/r200/r200_state_init.c
+++ b/src/mesa/drivers/dri/r200/r200_state_init.c
@@ -43,6 +43,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -5221,7 +5221,7 @@ index 9e4677e..30326c2 100644
return h.i;
}
-@@ -127,150 +243,474 @@ static int cmdscl2( int offset, int stride, int count )
+@@ -127,150 +243,475 @@ static int cmdscl2( int offset, int stride, int count )
}
#define CHECK( NM, FLAG ) \
@@ -5311,11 +5311,12 @@ index 9e4677e..30326c2 100644
+ OUT_BATCH_TABLE((data), h.vectors.count); \
+ } while(0)
+
-+#define OUT_VECLINEAR(hdr, data) do { \
-+ drm_radeon_cmd_header_t h; \
-+ uint32_t _start = h.veclinear.addr_lo | (h.veclinear.addr_hi << 8); \
-+ uint32_t _sz = h.veclinear.count * 4; \
++#define OUT_VECLINEAR(hdr, data) do { \
++ drm_radeon_cmd_header_t h; \
++ uint32_t _start, _sz; \
+ h.i = hdr; \
++ _start = h.veclinear.addr_lo | (h.veclinear.addr_hi << 8); \
++ _sz = h.veclinear.count * 4; \
+ OUT_BATCH(CP_PACKET0(RADEON_SE_TCL_STATE_FLUSH, 0)); \
+ OUT_BATCH(0); \
+ OUT_BATCH(CP_PACKET0(R200_SE_TCL_VECTOR_INDX_REG, 0)); \
@@ -5778,7 +5779,7 @@ index 9e4677e..30326c2 100644
ALLOC_STATE( set, always, SET_STATE_SIZE, "SET/setup", 0 );
ALLOC_STATE( lin, always, LIN_STATE_SIZE, "LIN/line", 0 );
ALLOC_STATE( msk, always, MSK_STATE_SIZE, "MSK/mask", 0 );
-@@ -282,8 +722,8 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -282,8 +723,8 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( cst, always, CST_STATE_SIZE, "CST/constant", 0 );
ALLOC_STATE( zbs, always, ZBS_STATE_SIZE, "ZBS/zbias", 0 );
ALLOC_STATE( tf, tf, TF_STATE_SIZE, "TF/tfactor", 0 );
@@ -5789,7 +5790,7 @@ index 9e4677e..30326c2 100644
/* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */
ALLOC_STATE( tex[0], tex_pair, TEX_STATE_SIZE_NEWDRM, "TEX/tex-0", 0 );
ALLOC_STATE( tex[1], tex_pair, TEX_STATE_SIZE_NEWDRM, "TEX/tex-1", 1 );
-@@ -303,7 +743,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -303,7 +744,7 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( afs[1], afs, AFS_STATE_SIZE, "AFS/afsinst-1", 1 );
}
else {
@@ -5798,7 +5799,7 @@ index 9e4677e..30326c2 100644
ALLOC_STATE( tex[0], tex_pair, TEX_STATE_SIZE_OLDDRM, "TEX/tex-0", 0 );
ALLOC_STATE( tex[1], tex_pair, TEX_STATE_SIZE_OLDDRM, "TEX/tex-1", 1 );
ALLOC_STATE( tam, tex_any, TAM_STATE_SIZE, "TAM/tam", 0 );
-@@ -321,13 +761,21 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -321,13 +762,21 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( afs[0], never, AFS_STATE_SIZE, "AFS/afsinst-0", 0 );
ALLOC_STATE( afs[1], never, AFS_STATE_SIZE, "AFS/afsinst-1", 1 );
}
@@ -5821,7 +5822,7 @@ index 9e4677e..30326c2 100644
}
else {
ALLOC_STATE( cube[0], never, CUBE_STATE_SIZE, "CUBE/tex-0", 0 );
-@@ -337,7 +785,8 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -337,7 +786,8 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( cube[4], never, CUBE_STATE_SIZE, "CUBE/tex-4", 4 );
ALLOC_STATE( cube[5], never, CUBE_STATE_SIZE, "CUBE/tex-5", 5 );
}
@@ -5831,7 +5832,7 @@ index 9e4677e..30326c2 100644
ALLOC_STATE( pvs, tcl_vp, PVS_STATE_SIZE, "PVS/pvscntl", 0 );
ALLOC_STATE( vpi[0], tcl_vp, VPI_STATE_SIZE, "VP/vertexprog-0", 0 );
ALLOC_STATE( vpi[1], tcl_vp_size, VPI_STATE_SIZE, "VP/vertexprog-1", 1 );
-@@ -390,13 +839,13 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -390,13 +840,13 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( pix[3], texenv, PIX_STATE_SIZE, "PIX/pixstage-3", 3 );
ALLOC_STATE( pix[4], texenv, PIX_STATE_SIZE, "PIX/pixstage-4", 4 );
ALLOC_STATE( pix[5], texenv, PIX_STATE_SIZE, "PIX/pixstage-5", 5 );
@@ -5847,7 +5848,7 @@ index 9e4677e..30326c2 100644
ALLOC_STATE( spr, always, SPR_STATE_SIZE, "SPR/pointsprite", 0 );
ALLOC_STATE( ptp, tcl, PTP_STATE_SIZE, "PTP/pointparams", 0 );
}
-@@ -409,87 +858,115 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -409,87 +859,115 @@ void r200InitState( r200ContextPtr rmesa )
/* Fill in the packet headers:
*/
@@ -6043,7 +6044,7 @@ index 9e4677e..30326c2 100644
rmesa->hw.mtl[0].cmd[MTL_CMD_0] =
cmdvec( R200_VS_MAT_0_EMISS, 1, 16 );
rmesa->hw.mtl[0].cmd[MTL_CMD_1] =
-@@ -567,7 +1044,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -567,7 +1045,7 @@ void r200InitState( r200ContextPtr rmesa )
(R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
(R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT));
@@ -6052,7 +6053,7 @@ index 9e4677e..30326c2 100644
rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = 0x00000000;
rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP |
(R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-@@ -578,18 +1055,17 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -578,18 +1056,17 @@ void r200InitState( r200ContextPtr rmesa )
}
rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHOFFSET] =
@@ -6074,7 +6075,7 @@ index 9e4677e..30326c2 100644
R200_STENCIL_TEST_ALWAYS |
R200_STENCIL_FAIL_KEEP |
R200_STENCIL_ZPASS_KEEP |
-@@ -599,15 +1075,14 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -599,15 +1076,14 @@ void r200InitState( r200ContextPtr rmesa )
if (rmesa->using_hyperz) {
rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_COMPRESSION_ENABLE |
R200_Z_DECOMPRESSION_ENABLE;
@@ -6092,7 +6093,7 @@ index 9e4677e..30326c2 100644
case DRI_CONF_DITHER_XERRORDIFFRESET:
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_INIT;
break;
-@@ -615,41 +1090,19 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -615,41 +1091,19 @@ void r200InitState( r200ContextPtr rmesa )
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_SCALE_DITHER_ENABLE;
break;
}
@@ -6140,7 +6141,7 @@ index 9e4677e..30326c2 100644
rmesa->hw.prf.cmd[PRF_PP_PERF_CNTL] = 0;
rmesa->hw.set.cmd[SET_SE_CNTL] = (R200_FFACE_CULL_CCW |
-@@ -704,7 +1157,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -704,7 +1158,7 @@ void r200InitState( r200ContextPtr rmesa )
R200_VC_NO_SWAP;
#endif
@@ -6149,7 +6150,7 @@ index 9e4677e..30326c2 100644
/* Bypass TCL */
rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] |= (1<<8);
}
-@@ -743,28 +1196,28 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -743,28 +1197,28 @@ void r200InitState( r200ContextPtr rmesa )
rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT_X] =
(/* R200_TEXCOORD_PROJ | */
0x100000); /* Small default bias */
@@ -6186,7 +6187,7 @@ index 9e4677e..30326c2 100644
rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND] =
(R200_TXC_ARG_A_ZERO |
-@@ -967,5 +1420,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -967,5 +1421,7 @@ void r200InitState( r200ContextPtr rmesa )
r200LightingSpaceChange( ctx );
@@ -12061,7 +12062,7 @@ index 89d7383..6bc8f8e 100644
extern int r300PrimitiveType(r300ContextPtr rmesa, int prim);
extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim);
diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c
-index ee85e22..71661ee 100644
+index ee85e22..1314550 100644
--- a/src/mesa/drivers/dri/r300/r300_ioctl.c
+++ b/src/mesa/drivers/dri/r300/r300_ioctl.c
@@ -46,8 +46,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -12347,7 +12348,7 @@ index ee85e22..71661ee 100644
(R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_SHIFT) |
(R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_SHIFT) |
(R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_SHIFT) |
-@@ -226,619 +266,399 @@ static void r300EmitClearState(GLcontext * ctx)
+@@ -226,619 +266,402 @@ static void r300EmitClearState(GLcontext * ctx)
<< R300_SWIZZLE1_SHIFT)));
/* R300_VAP_INPUT_CNTL_0, R300_VAP_INPUT_CNTL_1 */
@@ -12719,12 +12720,12 @@ index ee85e22..71661ee 100644
else
- vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT);
+ vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT);
-+
-+ R300_STATECHANGE(r300, vap_cntl);
- R300_STATECHANGE(rmesa, vap_cntl);
- reg_start(R300_VAP_CNTL, 0);
- e32(vap_cntl);
++ R300_STATECHANGE(r300, vap_cntl);
++
+ BEGIN_BATCH(2);
+ OUT_BATCH_REGVAL(R300_VAP_CNTL, vap_cntl);
+ END_BATCH();
@@ -12744,12 +12745,12 @@ index ee85e22..71661ee 100644
-
R300_STATECHANGE(r300, vpi);
- vsf_start_fragment(0x0, 8);
-
+-
- e32(PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 0, 0xf, PVS_DST_REG_OUT));
- e32(PVS_SRC_OPERAND(0, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
- e32(PVS_SRC_OPERAND(0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
- e32(0x0);
--
+
- e32(PVS_OP_DST_OPERAND(VE_ADD, GL_FALSE, GL_FALSE, 1, 0xf, PVS_DST_REG_OUT));
- e32(PVS_SRC_OPERAND(1, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y, PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
- e32(PVS_SRC_OPERAND(1, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_SELECT_FORCE_0, PVS_SRC_REG_INPUT, VSF_FLAG_NONE));
@@ -12824,7 +12825,7 @@ index ee85e22..71661ee 100644
- if (dPriv->numClipRects == 0)
- return;
- }
--
+
- if (mask & BUFFER_BIT_FRONT_LEFT) {
- flags |= BUFFER_BIT_FRONT_LEFT;
- mask &= ~BUFFER_BIT_FRONT_LEFT;
@@ -12836,38 +12837,40 @@ index ee85e22..71661ee 100644
- }
-
- if (mask & BUFFER_BIT_DEPTH) {
-- bits |= CLEARBUFFER_DEPTH;
++ /* Make sure it fits there. */
++ rcommonEnsureCmdBufSpace(&r300->radeon, 421 * 3, __FUNCTION__);
++ if (flags || bits)
++ r300EmitClearState(ctx);
++ rrbd = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH);
++ if (rrbd && (flags & BUFFER_BIT_DEPTH))
+ bits |= CLEARBUFFER_DEPTH;
- mask &= ~BUFFER_BIT_DEPTH;
- }
--
+
- if ((mask & BUFFER_BIT_STENCIL) && r300->state.stencil.hw_stencil) {
-- bits |= CLEARBUFFER_STENCIL;
++ if (rrbd && (flags & BUFFER_BIT_STENCIL))
+ bits |= CLEARBUFFER_STENCIL;
- mask &= ~BUFFER_BIT_STENCIL;
- }
--
+
- if (mask) {
- if (RADEON_DEBUG & DEBUG_FALLBACKS)
- fprintf(stderr, "%s: swrast clear, mask: %x\n",
- __FUNCTION__, mask);
- _swrast_Clear(ctx, mask);
-- }
--
-- swapped = r300->radeon.sarea->pfCurrentPage == 1;
-
- /* Make sure it fits there. */
-- r300EnsureCmdBufSpace(r300, 421 * 3, __FUNCTION__);
-+ rcommonEnsureCmdBufSpace(&r300->radeon, 421 * 3, __FUNCTION__);
- if (flags || bits)
- r300EmitClearState(ctx);
-+ rrbd = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH);
-+ if (rrbd && (flags & BUFFER_BIT_DEPTH))
-+ bits |= CLEARBUFFER_DEPTH;
-
+ if (flags & BUFFER_BIT_COLOR0) {
+ rrb = radeon_get_renderbuffer(&rfb->base, BUFFER_COLOR0);
+ r300ClearBuffer(r300, CLEARBUFFER_COLOR, rrb, NULL);
+ bits = 0;
-+ }
+ }
+-
+- swapped = r300->radeon.sarea->pfCurrentPage == 1;
+-
+- /* Make sure it fits there. */
+- r300EnsureCmdBufSpace(r300, 421 * 3, __FUNCTION__);
+- if (flags || bits)
+- r300EmitClearState(ctx);
+-
+
if (flags & BUFFER_BIT_FRONT_LEFT) {
- r300ClearBuffer(r300, bits | CLEARBUFFER_COLOR, swapped);
@@ -22064,10 +22067,10 @@ index 0000000..f3e2290
+#endif
diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c
new file mode 100644
-index 0000000..9964de7
+index 0000000..5766c9e
--- /dev/null
+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c
-@@ -0,0 +1,603 @@
+@@ -0,0 +1,606 @@
+/**************************************************************************
+
+Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
@@ -22578,8 +22581,11 @@ index 0000000..9964de7
+ }
+ }
+
-+ if (buffers[i].attachment == __DRI_BUFFER_DEPTH)
++ if (buffers[i].attachment == __DRI_BUFFER_DEPTH) {
++ if (draw->base.Visual.depthBits == 16)
++ rb->cpp = 2;
+ depth_bo = bo;
++ }
+
+ radeon_renderbuffer_set_bo(rb, bo);
+ radeon_bo_unref(bo);
@@ -25762,10 +25768,10 @@ index 0000000..cee3744
+#endif
diff --git a/src/mesa/drivers/dri/radeon/radeon_fbo.c b/src/mesa/drivers/dri/radeon/radeon_fbo.c
new file mode 100644
-index 0000000..96ba5d3
+index 0000000..d17835b
--- /dev/null
+++ b/src/mesa/drivers/dri/radeon/radeon_fbo.c
-@@ -0,0 +1,568 @@
+@@ -0,0 +1,577 @@
+/**************************************************************************
+ *
+ * Copyright 2008 Red Hat Inc.
@@ -26042,6 +26048,15 @@ index 0000000..96ba5d3
+ rrb->base.BlueBits = 5;
+ rrb->base.DataType = GL_UNSIGNED_BYTE;
+ break;
++ case GL_RGB8:
++ rrb->base._ActualFormat = GL_RGB8;
++ rrb->base._BaseFormat = GL_RGB;
++ rrb->base.RedBits = 8;
++ rrb->base.GreenBits = 8;
++ rrb->base.BlueBits = 8;
++ rrb->base.AlphaBits = 8;
++ rrb->base.DataType = GL_UNSIGNED_BYTE;
++ break;
+ case GL_RGBA8:
+ rrb->base._ActualFormat = GL_RGBA8;
+ rrb->base._BaseFormat = GL_RGBA;
@@ -29483,7 +29498,7 @@ index 1ec06bc..f30eb1c 100644
drm_clip_rect_t *boxes );
diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
-index e964feb..3817007 100644
+index e964feb..98fa141 100644
--- a/src/mesa/drivers/dri/radeon/radeon_screen.c
+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
@@ -35,6 +35,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -29950,8 +29965,7 @@ index e964feb..3817007 100644
}
+ if (!screen->kernel_mm) {
- #if !RADEON_COMMON
-- screen->extensions[i++] = &radeonTexOffsetExtension.base;
++#if !RADEON_COMMON
+ screen->extensions[i++] = &radeonTexOffsetExtension.base;
+#endif
+
@@ -30081,7 +30095,8 @@ index e964feb..3817007 100644
+ screen->extensions[i++] = &driMediaStreamCounterExtension.base;
+ }
+
-+#if !RADEON_COMMON
+ #if !RADEON_COMMON
+- screen->extensions[i++] = &radeonTexOffsetExtension.base;
+ screen->extensions[i++] = &radeonTexBufferExtension.base;
#endif
@@ -30185,7 +30200,7 @@ index e964feb..3817007 100644
/**
* Create the Mesa framebuffer and renderbuffers for a given window/drawable.
*
-@@ -1026,98 +1227,91 @@ radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv,
+@@ -1026,98 +1227,98 @@ radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv,
const __GLcontextModes *mesaVis,
GLboolean isPixmap )
{
@@ -30197,7 +30212,7 @@ index e964feb..3817007 100644
+ const GLboolean swAccum = mesaVis->accumRedBits > 0;
+ const GLboolean swStencil = mesaVis->stencilBits > 0 &&
+ mesaVis->depthBits != 24;
-+ GLenum rgbFormat = (mesaVis->redBits == 5 ? GL_RGB5 : GL_RGBA8);
++ GLenum rgbFormat;
+ struct radeon_framebuffer *rfb;
- if (isPixmap) {
@@ -30263,6 +30278,25 @@ index e964feb..3817007 100644
- depthRb->depthHasSurface = screen->depthHasSurface;
- }
+ _mesa_initialize_framebuffer(&rfb->base, mesaVis);
++
++ if (mesaVis->redBits == 5)
++ rgbFormat = GL_RGB5;
++ else if (mesaVis->alphaBits == 0)
++ rgbFormat = GL_RGB8;
++ else
++ rgbFormat = GL_RGBA8;
++
++ /* front color renderbuffer */
++ rfb->color_rb[0] = radeon_create_renderbuffer(rgbFormat, driDrawPriv);
++ _mesa_add_renderbuffer(&rfb->base, BUFFER_FRONT_LEFT, &rfb->color_rb[0]->base);
++ rfb->color_rb[0]->has_surface = 1;
++
++ /* back color renderbuffer */
++ if (mesaVis->doubleBufferMode) {
++ rfb->color_rb[1] = radeon_create_renderbuffer(rgbFormat, driDrawPriv);
++ _mesa_add_renderbuffer(&rfb->base, BUFFER_BACK_LEFT, &rfb->color_rb[1]->base);
++ rfb->color_rb[1]->has_surface = 1;
++ }
- /* stencil renderbuffer */
- if (mesaVis->stencilBits > 0 && !swStencil) {
@@ -30275,18 +30309,6 @@ index e964feb..3817007 100644
- radeonSetSpanFunctions(stencilRb, mesaVis);
- _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);
- stencilRb->depthHasSurface = screen->depthHasSurface;
-+ /* front color renderbuffer */
-+ rfb->color_rb[0] = radeon_create_renderbuffer(rgbFormat, driDrawPriv);
-+ _mesa_add_renderbuffer(&rfb->base, BUFFER_FRONT_LEFT, &rfb->color_rb[0]->base);
-+ rfb->color_rb[0]->has_surface = 1;
-+
-+ /* back color renderbuffer */
-+ if (mesaVis->doubleBufferMode) {
-+ rfb->color_rb[1] = radeon_create_renderbuffer(rgbFormat, driDrawPriv);
-+ _mesa_add_renderbuffer(&rfb->base, BUFFER_BACK_LEFT, &rfb->color_rb[1]->base);
-+ rfb->color_rb[1]->has_surface = 1;
-+ }
-+
+ if (mesaVis->depthBits == 24) {
+ if (mesaVis->stencilBits == 8) {
+ struct radeon_renderbuffer *depthStencilRb = radeon_create_renderbuffer(GL_DEPTH24_STENCIL8_EXT, driDrawPriv);
@@ -30356,7 +30378,7 @@ index e964feb..3817007 100644
}
#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
-@@ -1211,13 +1405,103 @@ radeonInitScreen(__DRIscreenPrivate *psp)
+@@ -1211,13 +1412,103 @@ radeonInitScreen(__DRIscreenPrivate *psp)
if (!radeonInitDriver(psp))
return NULL;
@@ -30462,7 +30484,7 @@ index e964feb..3817007 100644
/**
* Get information about previous buffer swaps.
-@@ -1225,25 +1509,21 @@ radeonInitScreen(__DRIscreenPrivate *psp)
+@@ -1225,25 +1516,21 @@ radeonInitScreen(__DRIscreenPrivate *psp)
static int
getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo )
{
@@ -30498,7 +30520,7 @@ index e964feb..3817007 100644
: 0.0;
return 0;
-@@ -1266,6 +1546,8 @@ const struct __DriverAPIRec driDriverAPI = {
+@@ -1266,6 +1553,8 @@ const struct __DriverAPIRec driDriverAPI = {
.WaitForSBC = NULL,
.SwapBuffersMSC = NULL,
.CopySubBuffer = radeonCopySubBuffer,
@@ -30507,7 +30529,7 @@ index e964feb..3817007 100644
};
#else
const struct __DriverAPIRec driDriverAPI = {
-@@ -1275,14 +1557,16 @@ const struct __DriverAPIRec driDriverAPI = {
+@@ -1275,14 +1564,16 @@ const struct __DriverAPIRec driDriverAPI = {
.DestroyContext = r200DestroyContext,
.CreateBuffer = radeonCreateBuffer,
.DestroyBuffer = radeonDestroyBuffer,
@@ -30556,10 +30578,10 @@ index b84c70b..1c0f5bb 100644
#define IS_R100_CLASS(screen) \
diff --git a/src/mesa/drivers/dri/radeon/radeon_span.c b/src/mesa/drivers/dri/radeon/radeon_span.c
-index 12051ff..0b4eaae 100644
+index 12051ff..b0c77be 100644
--- a/src/mesa/drivers/dri/radeon/radeon_span.c
+++ b/src/mesa/drivers/dri/radeon/radeon_span.c
-@@ -43,46 +43,190 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+@@ -43,46 +43,203 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "main/glheader.h"
#include "swrast/swrast.h"
@@ -30704,6 +30726,19 @@ index 12051ff..0b4eaae 100644
+ return &ptr[offset];
+}
+
++#ifndef COMPILE_R300
++static uint32_t
++z24s8_to_s8z24(uint32_t val)
++{
++ return (val << 24) | (val >> 8);
++}
++
++static uint32_t
++s8z24_to_z24s8(uint32_t val)
++{
++ return (val >> 24) | (val << 8);
++}
++#endif
+
/*
* Note that all information needed to access pixels in a renderbuffer
@@ -30770,7 +30805,7 @@ index 12051ff..0b4eaae 100644
/* ================================================================
* Color buffer
*/
-@@ -94,7 +238,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+@@ -94,7 +251,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define TAG(x) radeon##x##_RGB565
#define TAG2(x,y) radeon##x##_RGB565##y
@@ -30785,11 +30820,15 @@ index 12051ff..0b4eaae 100644
+
+#define TAG(x) radeon##x##_xRGB8888
+#define TAG2(x,y) radeon##x##_xRGB8888##y
-+#define GET_PTR(X,Y) radeon_ptr32(rrb, (X) + x_off, (Y) + y_off)
++#define GET_VALUE(_x, _y) ((*(GLuint*)(radeon_ptr32(rrb, _x + x_off, _y + y_off)) | 0xff000000))
++#define PUT_VALUE(_x, _y, d) { \
++ GLuint *_ptr = (GLuint*)radeon_ptr32( rrb, _x + x_off, _y + y_off ); \
++ *_ptr = d; \
++} while (0)
#include "spantmp2.h"
/* 32 bit, ARGB8888 color spanline and pixel functions
-@@ -104,7 +258,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+@@ -104,7 +275,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define TAG(x) radeon##x##_ARGB8888
#define TAG2(x,y) radeon##x##_ARGB8888##y
@@ -30798,7 +30837,7 @@ index 12051ff..0b4eaae 100644
#include "spantmp2.h"
/* ================================================================
-@@ -121,65 +275,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+@@ -121,70 +292,20 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* too...
*/
@@ -30866,7 +30905,13 @@ index 12051ff..0b4eaae 100644
#define TAG(x) radeon##x##_z16
#include "depthtmp.h"
-@@ -194,35 +298,36 @@ radeon_mba_z16(const driRenderbuffer * drb, GLint x, GLint y)
+
+-/* 24 bit depth, 8 bit stencil depthbuffer functions
++/* 24 bit depth
+ *
+ * Careful: It looks like the R300 uses ZZZS byte order while the R200
+ * uses SZZZ for 24 bit depth, 8 bit stencil mode.
+@@ -194,35 +315,76 @@ radeon_mba_z16(const driRenderbuffer * drb, GLint x, GLint y)
#ifdef COMPILE_R300
#define WRITE_DEPTH( _x, _y, d ) \
do { \
@@ -30895,18 +30940,59 @@ index 12051ff..0b4eaae 100644
#ifdef COMPILE_R300
#define READ_DEPTH( d, _x, _y ) \
- do { \
+- do { \
- d = (*(GLuint *)(buf + radeon_mba_z32( drb, _x + xo, \
- _y + yo )) & 0xffffff00) >> 8; \
++ do { \
+ d = (*(GLuint*)(radeon_ptr32(rrb, _x + x_off, _y + y_off)) & 0xffffff00) >> 8; \
}while(0)
#else
- #define READ_DEPTH( d, _x, _y ) \
+-#define READ_DEPTH( d, _x, _y ) \
- d = *(GLuint *)(buf + radeon_mba_z32( drb, _x + xo, \
- _y + yo )) & 0x00ffffff;
-+ d = *(GLuint*)(radeon_ptr32(rrb, _x + x_off, _y + y_off )) & 0x00ffffff;
++#define READ_DEPTH( d, _x, _y ) \
++ d = *(GLuint*)(radeon_ptr32(rrb, _x + x_off, _y + y_off)) & 0x00ffffff;
++#endif
++/*
++ fprintf(stderr, "dval(%d, %d, %d, %d)=0x%08X\n", _x, xo, _y, yo, d);\
++ d = *(GLuint*)(radeon_ptr(rrb, _x, _y )) & 0x00ffffff;
++*/
++#define TAG(x) radeon##x##_z24
++#include "depthtmp.h"
++
++/* 24 bit depth, 8 bit stencil depthbuffer functions
++ * EXT_depth_stencil
++ *
++ * Careful: It looks like the R300 uses ZZZS byte order while the R200
++ * uses SZZZ for 24 bit depth, 8 bit stencil mode.
++ */
++#define VALUE_TYPE GLuint
++
++#ifdef COMPILE_R300
++#define WRITE_DEPTH( _x, _y, d ) \
++do { \
++ GLuint *_ptr = (GLuint*)radeon_ptr32( rrb, _x + x_off, _y + y_off ); \
++ *_ptr = d; \
++} while (0)
++#else
++#define WRITE_DEPTH( _x, _y, d ) \
++do { \
++ GLuint *_ptr = (GLuint*)radeon_ptr32( rrb, _x + x_off, _y + y_off ); \
++ GLuint tmp = z24s8_to_s8z24(d); \
++ *_ptr = tmp; \
++} while (0)
#endif
--
+
++#ifdef COMPILE_R300
++#define READ_DEPTH( d, _x, _y ) \
++ do { \
++ d = (*(GLuint*)(radeon_ptr32(rrb, _x + x_off, _y + y_off))); \
++ }while(0)
++#else
++#define READ_DEPTH( d, _x, _y ) do { \
++ d = s8z24_to_z24s8(*(GLuint*)(radeon_ptr32(rrb, _x + x_off, _y + y_off ))); \
++ } while (0)
++#endif
+/*
+ fprintf(stderr, "dval(%d, %d, %d, %d)=0x%08X\n", _x, xo, _y, yo, d);\
+ d = *(GLuint*)(radeon_ptr(rrb, _x, _y )) & 0x00ffffff;
@@ -30914,7 +31000,7 @@ index 12051ff..0b4eaae 100644
#define TAG(x) radeon##x##_z24_s8
#include "depthtmp.h"
-@@ -235,35 +340,35 @@ do { \
+@@ -235,35 +397,35 @@ do { \
#ifdef COMPILE_R300
#define WRITE_STENCIL( _x, _y, d ) \
do { \
@@ -30960,7 +31046,7 @@ index 12051ff..0b4eaae 100644
d = (tmp & 0xff000000) >> 24; \
} while (0)
#endif
-@@ -271,20 +376,83 @@ do { \
+@@ -271,29 +433,103 @@ do { \
#define TAG(x) radeon##x##_z24_s8
#include "stenciltmp.h"
@@ -31039,13 +31125,6 @@ index 12051ff..0b4eaae 100644
+
+ radeon_firevertices(rmesa);
+
-+ for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
-+ if (ctx->Texture.Unit[i]._ReallyEnabled)
-+ ctx->Driver.MapTexture(ctx, ctx->Texture.Unit[i]._Current);
-+ }
-+
-+ radeon_map_unmap_buffers(ctx, 1);
-+
+ /* The locking and wait for idle should really only be needed in classic mode.
+ * In a future memory manager based implementation, this should become
+ * unnecessary due to the fact that mapping our buffers, textures, etc.
@@ -31053,8 +31132,18 @@ index 12051ff..0b4eaae 100644
+ * be waited on. */
LOCK_HARDWARE(rmesa);
radeonWaitForIdleLocked(rmesa);
++
++ for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
++ if (ctx->Texture.Unit[i]._ReallyEnabled)
++ ctx->Driver.MapTexture(ctx, ctx->Texture.Unit[i]._Current);
++ }
++
++ radeon_map_unmap_buffers(ctx, 1);
++
++
++
}
-@@ -292,8 +460,16 @@ static void radeonSpanRenderStart(GLcontext * ctx)
+
static void radeonSpanRenderFinish(GLcontext * ctx)
{
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
@@ -31071,7 +31160,7 @@ index 12051ff..0b4eaae 100644
}
void radeonInitSpanFuncs(GLcontext * ctx)
-@@ -307,20 +483,21 @@ void radeonInitSpanFuncs(GLcontext * ctx)
+@@ -307,20 +543,21 @@ void radeonInitSpanFuncs(GLcontext * ctx)
/**
* Plug in the Get/Put routines for the given driRenderbuffer.
*/
@@ -31100,9 +31189,9 @@ index 12051ff..0b4eaae 100644
+ } else if (rrb->base._ActualFormat == GL_DEPTH_COMPONENT16) {
+ radeonInitDepthPointers_z16(&rrb->base);
+ } else if (rrb->base._ActualFormat == GL_DEPTH_COMPONENT24) {
-+ radeonInitDepthPointers_z24_s8(&rrb->base);
++ radeonInitDepthPointers_z24(&rrb->base);
+ } else if (rrb->base._ActualFormat == GL_DEPTH24_STENCIL8_EXT) {
-+ radeonInitStencilPointers_z24_s8(&rrb->base);
++ radeonInitDepthPointers_z24_s8(&rrb->base);
+ } else if (rrb->base._ActualFormat == GL_STENCIL_INDEX8_EXT) {
+ radeonInitStencilPointers_z24_s8(&rrb->base);
}
@@ -35617,10 +35706,10 @@ index b165205..dab0df0 100644
}
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
new file mode 100644
-index 0000000..a38d76a
+index 0000000..21529f6
--- /dev/null
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
-@@ -0,0 +1,993 @@
+@@ -0,0 +1,987 @@
+/*
+ * Copyright (C) 2008 Nicolai Haehnle.
+ * Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
@@ -35899,6 +35988,8 @@ index 0000000..a38d76a
+ (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
+ (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian)) {
+ return &_mesa_texformat_rgba8888_rev;
++ } else if (IS_R200_CLASS(rmesa->radeonScreen)) {
++ return _dri_texformat_argb8888;
+ } else if (srcFormat == GL_BGRA && ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
+ srcType == GL_UNSIGNED_INT_8_8_8_8)) {
+ return &_mesa_texformat_argb8888_rev;
@@ -35999,8 +36090,12 @@ index 0000000..a38d76a
+ case GL_ALPHA12:
+ case GL_ALPHA16:
+ case GL_COMPRESSED_ALPHA:
-+ return _dri_texformat_a8;
-+
++ /* r200: can't use a8 format since interpreting hw I8 as a8 would result
++ in wrong rgb values (same as alpha value instead of 0). */
++ if (IS_R200_CLASS(rmesa->radeonScreen))
++ return _dri_texformat_al88;
++ else
++ return _dri_texformat_a8;
+ case 1:
+ case GL_LUMINANCE:
+ case GL_LUMINANCE4:
@@ -36081,25 +36176,13 @@ index 0000000..a38d76a
+ case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT24:
+ case GL_DEPTH_COMPONENT32:
-+#if 0
-+ switch (type) {
-+ case GL_UNSIGNED_BYTE:
-+ case GL_UNSIGNED_SHORT:
-+ return &_mesa_texformat_z16;
-+ case GL_UNSIGNED_INT:
-+ return &_mesa_texformat_z32;
-+ case GL_UNSIGNED_INT_24_8_EXT:
-+ default:
-+ return &_mesa_texformat_z24_s8;
-+ }
-+#else
-+ return &_mesa_texformat_z16;
-+#endif
-+
++ case GL_DEPTH_STENCIL_EXT:
++ case GL_DEPTH24_STENCIL8_EXT:
++ return &_mesa_texformat_s8_z24;
+ default:
+ _mesa_problem(ctx,
-+ "unexpected internalFormat 0x%x in r300ChooseTextureFormat",
-+ (int)internalFormat);
++ "unexpected internalFormat 0x%x in %s",
++ (int)internalFormat, __func__);
+ return NULL;
+ }
+