summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgareth <gareth>2001-01-04 19:59:45 +0000
committergareth <gareth>2001-01-04 19:59:45 +0000
commitcbbf7821a601693b9267d642780b8194ed5e5aec (patch)
tree23ef3a3e7248d8bd18c2f2d9d2f7e6808b2f43a7
parent2c742ce0560147e4472bd448096c74889bfdbe58 (diff)
- Fix subpixel precision errors.
- Fix software alpha buffer initialization. - Clean up depth clears, fixes SoF and H2 bugs.
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_context.h9
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_dd.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_eltpath.c6
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_fastpath.c16
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c3
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_span.c4
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_state.c23
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c11
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_tris.h4
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_vb.c20
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_xmesa.c4
-rw-r--r--xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c52
-rw-r--r--xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.c2
-rw-r--r--xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.h16
-rw-r--r--xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c91
15 files changed, 136 insertions, 127 deletions
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h b/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h
index fb1fbbb4b..502c088eb 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h
@@ -81,15 +81,6 @@ typedef struct radeon_context *radeonContextPtr;
#define RADEON_FALLBACK_MULTIDRAW 0x0020
#define RADEON_FALLBACK_LOGICOP 0x0040
-/* Subpixel offsets for window coordinates: */
-#if 1
-#define SUBPIXEL_X (-0.125F)
-#define SUBPIXEL_Y ( 0.375F)
-#else
-#define SUBPIXEL_X (0.0F)
-#define SUBPIXEL_Y (0.0F)
-#endif
-
typedef void (*radeon_interp_func)( GLfloat t,
GLfloat *result,
const GLfloat *in,
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_dd.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_dd.c
index 6141fd88e..313d00b8f 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_dd.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_dd.c
@@ -46,7 +46,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "X86/common_x86_asm.h"
#endif
-#define RADEON_DATE "20010103"
+#define RADEON_DATE "20010105"
/* Return the width and height of the current color buffer.
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_eltpath.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_eltpath.c
index 0909c4b82..2957083e2 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_eltpath.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_eltpath.c
@@ -360,9 +360,9 @@ static void refresh_projection_matrix( GLcontext *ctx )
m[MAT_SX] = mat->m[MAT_SX];
m[MAT_TX] = mat->m[MAT_TX];
m[MAT_SY] = -mat->m[MAT_SY];
- m[MAT_TY] = -mat->m[MAT_TY] + rmesa->driDrawable->h;
- m[MAT_SZ] = mat->m[MAT_SZ] * rmesa->depth_scale;
- m[MAT_TZ] = mat->m[MAT_TZ] * rmesa->depth_scale;
+ m[MAT_TY] = -mat->m[MAT_TY];
+ m[MAT_SZ] = mat->m[MAT_SZ];
+ m[MAT_TZ] = mat->m[MAT_TZ];
}
#define CLIP_UBYTE_R 0
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_fastpath.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_fastpath.c
index af1a0e434..7c32a0f15 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_fastpath.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_fastpath.c
@@ -418,6 +418,10 @@ static void radeon_render_elements_direct( struct vertex_buffer *VB )
ctx->Driver.MultipassFunc( VB, ++p ) );
}
+/* GH: These should go away altogether on the Radeon. We should disable
+ * the viewport mapping entirely in Mesa and let the hardware do it in
+ * all cases.
+ */
static void radeon_project_vertices( struct vertex_buffer *VB )
{
GLcontext *ctx = VB->ctx;
@@ -429,9 +433,9 @@ static void radeon_project_vertices( struct vertex_buffer *VB )
m[MAT_SX] = mat->m[MAT_SX];
m[MAT_TX] = mat->m[MAT_TX];
m[MAT_SY] = -mat->m[MAT_SY];
- m[MAT_TY] = -mat->m[MAT_TY] + rmesa->driDrawable->h;
- m[MAT_SZ] = mat->m[MAT_SZ] * rmesa->depth_scale;
- m[MAT_TZ] = mat->m[MAT_TZ] * rmesa->depth_scale;
+ m[MAT_TY] = -mat->m[MAT_TY];
+ m[MAT_SZ] = mat->m[MAT_SZ];
+ m[MAT_TZ] = mat->m[MAT_TZ];
gl_project_v16( rvb->verts[VB->CopyStart].f,
rvb->verts[rvb->last_vert].f,
@@ -450,9 +454,9 @@ static void radeon_project_clipped_vertices( struct vertex_buffer *VB )
m[MAT_SX] = mat->m[MAT_SX];
m[MAT_TX] = mat->m[MAT_TX];
m[MAT_SY] = -mat->m[MAT_SY];
- m[MAT_TY] = -mat->m[MAT_TY] + rmesa->driDrawable->h;
- m[MAT_SZ] = mat->m[MAT_SZ] * rmesa->depth_scale;
- m[MAT_TZ] = mat->m[MAT_TZ] * rmesa->depth_scale;
+ m[MAT_TY] = -mat->m[MAT_TY];
+ m[MAT_SZ] = mat->m[MAT_SZ];
+ m[MAT_TZ] = mat->m[MAT_TZ];
gl_project_clipped_v16( rvb->verts[VB->CopyStart].f,
rvb->verts[rvb->last_vert].f,
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c
index d909e574e..22ad27962 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_ioctl.c
@@ -542,7 +542,8 @@ static GLbitfield radeonDDClear( GLcontext *ctx, GLbitfield mask,
GLint ret, i;
if ( RADEON_DEBUG & DEBUG_VERBOSE_API ) {
- fprintf( stderr, "%s:\n", __FUNCTION__ );
+ fprintf( stderr, "%s: all=%d cx=%d cy=%d cw=%d ch=%d\n",
+ __FUNCTION__, all, cx, cy, cw, ch );
}
FLUSH_BATCH( rmesa );
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_span.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_span.c
index 9b154f7f5..69fc1870a 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_span.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_span.c
@@ -88,7 +88,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
_n1 = _n; \
_x1 = _x; \
if (_x1 < minx) _i += (minx - _x1), _x1 = minx; \
- if (_x1 + _n1 >= maxx) n1 -= (_x1 + n1 - maxx) + 1; \
+ if (_x1 + _n1 >= maxx) n1 -= (_x1 + n1 - maxx); \
}
#define Y_FLIP( _y ) (height - _y - 1)
@@ -234,7 +234,7 @@ static __inline GLuint radeon_mba_z32( radeonContextPtr rmesa,
*(GLushort *)(buf + radeon_mba_z16( rmesa, _x, _y )) = d;
#define READ_DEPTH( d, _x, _y ) \
- d = *(GLushort *)(buf + radeon_mba_z16( rmesa, _x, _y ) )
+ d = *(GLushort *)(buf + radeon_mba_z16( rmesa, _x, _y ));
#define TAG(x) radeon##x##_16
#include "depthtmp.h"
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_state.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_state.c
index b66845433..4c87ed7aa 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_state.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_state.c
@@ -562,19 +562,23 @@ static void radeonDDShadeModel( GLcontext *ctx, GLenum mode )
void radeonUpdateWindow( GLcontext *ctx )
{
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
- CARD32 m = rmesa->setup.re_misc;
- GLfloat x = (GLfloat) rmesa->driDrawable->x;
- GLfloat y = (GLfloat) rmesa->driDrawable->y;
+ __DRIdrawablePrivate *dPriv = rmesa->driDrawable;
+ GLfloat xoffset = (GLfloat)dPriv->x;
+ GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
const GLfloat one = 1.0;
+#if 0
+ CARD32 m = rmesa->setup.re_misc;
CARD32 sx, sy;
+#endif
rmesa->setup.se_vport_xscale = *(GLuint *)&one;
- rmesa->setup.se_vport_xoffset = *(GLuint *)&x;
+ rmesa->setup.se_vport_xoffset = *(GLuint *)&xoffset;
rmesa->setup.se_vport_yscale = *(GLuint *)&one;
- rmesa->setup.se_vport_yoffset = *(GLuint *)&y;
- rmesa->setup.se_vport_zscale = *(GLuint *)&one;
+ rmesa->setup.se_vport_yoffset = *(GLuint *)&yoffset;
+ rmesa->setup.se_vport_zscale = *(GLuint *)&rmesa->depth_scale;
rmesa->setup.se_vport_zoffset = 0x00000000;
+#if 0
/* FIXME: This appears to be broken...
*/
m &= ~(RADEON_STIPPLE_X_OFFSET_MASK |
@@ -586,11 +590,12 @@ void radeonUpdateWindow( GLcontext *ctx )
m |= ((sx << RADEON_STIPPLE_X_OFFSET_SHIFT) |
(sy << RADEON_STIPPLE_Y_OFFSET_SHIFT));
- rmesa->dirty |= RADEON_UPLOAD_VIEWPORT;
if ( rmesa->setup.re_misc != m ) {
rmesa->setup.re_misc = m;
rmesa->dirty |= RADEON_UPLOAD_MISC;
}
+#endif
+ rmesa->dirty |= RADEON_UPLOAD_VIEWPORT;
}
@@ -889,6 +894,9 @@ void radeonEmitHwStateLocked( radeonContextPtr rmesa )
memcpy( &sarea->ContextState, regs, sizeof(sarea->ContextState) );
}
+ /* Assemble the texture state, combining the texture object and
+ * texture environment state into the hardware texture unit state.
+ */
if ( (rmesa->dirty & RADEON_UPLOAD_TEX0) && t0 ) {
radeon_texture_regs_t *tex = &sarea->TexState[0];
@@ -1181,6 +1189,7 @@ void radeonDDInitState( radeonContextPtr rmesa )
RADEON_SPECULAR_SHADE_GOURAUD |
RADEON_FOG_SHADE_GOURAUD |
RADEON_VPORT_XY_XFORM_ENABLE |
+ RADEON_VPORT_Z_XFORM_ENABLE |
RADEON_VTX_PIX_CENTER_OGL |
RADEON_ROUND_MODE_TRUNC |
RADEON_ROUND_PREC_8TH_PIX);
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c
index fe0bd6543..47dd1a547 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c
@@ -143,7 +143,9 @@ static radeonTexObjPtr radeonCreateTexObj( radeonContextPtr rmesa,
switch ( image->Format ) {
case GL_RGBA:
- if ( rmesa->radeonScreen->cpp == 4 ) {
+ if ( image->IntFormat != GL_RGBA4 &&
+ ( image->IntFormat == GL_RGBA8 ||
+ rmesa->radeonScreen->cpp == 4 ) ) {
t->texelBytes = 4;
txformat = RADEON_TXF_32BPP_ARGB8888;
} else {
@@ -154,7 +156,9 @@ static radeonTexObjPtr radeonCreateTexObj( radeonContextPtr rmesa,
break;
case GL_RGB:
- if ( rmesa->radeonScreen->cpp == 4 ) {
+ if ( image->IntFormat != GL_RGB5 &&
+ ( image->IntFormat == GL_RGB8 ||
+ rmesa->radeonScreen->cpp == 4 ) ) {
t->texelBytes = 4;
txformat = RADEON_TXF_32BPP_ARGB8888;
} else {
@@ -906,9 +910,6 @@ static void radeonUploadSubImage( radeonContextPtr rmesa,
rmesa->new_state |= RADEON_NEW_CONTEXT;
rmesa->dirty |= RADEON_UPLOAD_CONTEXT | RADEON_UPLOAD_MASKS;
-
-
- radeonWaitForIdleLocked( rmesa );
}
/* Upload the texture images associated with texture `t'. This might
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_tris.h b/xc/lib/GL/mesa/src/drv/radeon/radeon_tris.h
index 5ddd0923a..8a77de803 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_tris.h
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_tris.h
@@ -163,7 +163,7 @@ static __inline void radeon_draw_quad( radeonContextPtr rmesa,
static __inline void radeon_draw_line( radeonContextPtr rmesa,
radeonVertexPtr tmp0,
radeonVertexPtr tmp1,
- float width )
+ GLfloat width )
{
#if 1
GLuint vertsize = rmesa->vertsize;
@@ -248,7 +248,7 @@ static __inline void radeon_draw_line( radeonContextPtr rmesa,
}
static __inline void radeon_draw_point( radeonContextPtr rmesa,
- radeonVertexPtr tmp, float sz )
+ radeonVertexPtr tmp, GLfloat sz )
{
#if 1
GLuint vertsize = rmesa->vertsize;
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_vb.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_vb.c
index 52780ec9d..c3421c5d9 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_vb.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_vb.c
@@ -107,9 +107,9 @@ do { \
#define COORD \
do { \
GLfloat *win = VB->Win.data[i]; \
- v->v.x = win[0] + xoffset; \
- v->v.y = - win[1] + yoffset; \
- v->v.z = depth_scale * win[2]; \
+ v->v.x = win[0]; \
+ v->v.y = - win[1]; \
+ v->v.z = win[2]; \
v->v.rhw = v->v.rhw2 = win[3]; \
} while (0)
@@ -120,10 +120,10 @@ do { \
#define COORD \
do { \
GLfloat *win = VB->Win.data[i]; \
- v->v.x = win[0] + xoffset; \
- v->v.y = - win[1] + yoffset; \
- v->v.z = depth_scale * win[2]; \
- v->v.rhw = win[3]; \
+ v->v.x = win[0]; \
+ v->v.y = - win[1]; \
+ v->v.z = win[2]; \
+ v->v.rhw = win[3]; \
} while (0) \
#endif /* USE_RHW2 */
@@ -135,17 +135,11 @@ do { \
static void name( struct vertex_buffer *VB, GLuint start, GLuint end ) \
{ \
radeonContextPtr rmesa = RADEON_CONTEXT(VB->ctx); \
- __DRIdrawablePrivate *dPriv = rmesa->driDrawable; \
radeonVertexPtr v; \
GLfloat (*tc0)[4]; \
GLfloat (*tc1)[4]; \
- const GLfloat depth_scale = rmesa->depth_scale; \
- const GLfloat xoffset = SUBPIXEL_X; \
- const GLfloat yoffset = dPriv->h + SUBPIXEL_Y; \
GLint i; \
\
- (void) xoffset; (void) yoffset; (void) depth_scale; \
- \
gl_import_client_data( VB, VB->ctx->RenderFlags, \
(VB->ClipOrMask \
? VEC_WRITABLE | VEC_GOOD_STRIDE \
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_xmesa.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_xmesa.c
index 51aeae630..4d79f770c 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_xmesa.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_xmesa.c
@@ -126,10 +126,10 @@ GLframebuffer *XMesaCreateWindowBuffer( Display *dpy,
GLvisual *mesaVis )
{
return gl_create_framebuffer( mesaVis,
- GL_FALSE, /* software depth buffer? */
+ GL_FALSE, /* software depth buffer? */
mesaVis->StencilBits > 0,
mesaVis->AccumRedBits > 0,
- mesaVis->AlphaBits > 0 );
+ GL_FALSE /* software alpha buffer? */ );
}
/* Create and initialize the Mesa and driver specific pixmap buffer
diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c
index 0df883c67..5d662bc08 100644
--- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c
+++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_cp.c
@@ -667,13 +667,29 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
return -EINVAL;
}
- dev_priv->fb_bpp = init->fb_bpp;
+ switch ( init->fb_bpp ) {
+ case 16:
+ dev_priv->color_fmt = RADEON_COLOR_FORMAT_RGB565;
+ break;
+ case 32:
+ default:
+ dev_priv->color_fmt = RADEON_COLOR_FORMAT_ARGB8888;
+ break;
+ }
dev_priv->front_offset = init->front_offset;
dev_priv->front_pitch = init->front_pitch;
dev_priv->back_offset = init->back_offset;
dev_priv->back_pitch = init->back_pitch;
- dev_priv->depth_bpp = init->depth_bpp;
+ switch ( init->depth_bpp ) {
+ case 16:
+ dev_priv->depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
+ break;
+ case 32:
+ default:
+ dev_priv->depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
+ break;
+ }
dev_priv->depth_offset = init->depth_offset;
dev_priv->depth_pitch = init->depth_pitch;
@@ -684,6 +700,38 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
dev_priv->depth_pitch_offset = (((dev_priv->depth_pitch/64) << 22) |
(dev_priv->depth_offset >> 10));
+ /* Hardware state for depth clears. Remove this if/when we no
+ * longer clear the depth buffer with a 3D rectangle. Hard-code
+ * all values to prevent unwanted 3D state from slipping through
+ * and screwing with the clear operation.
+ */
+ dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE |
+ RADEON_Z_ENABLE |
+ (dev_priv->color_fmt << 10) |
+ RADEON_ZBLOCK16);
+
+ dev_priv->depth_clear.rb3d_zstencilcntl = (dev_priv->depth_fmt |
+ RADEON_Z_TEST_ALWAYS |
+ RADEON_STENCIL_TEST_ALWAYS |
+ RADEON_STENCIL_S_FAIL_KEEP |
+ RADEON_STENCIL_ZPASS_KEEP |
+ RADEON_STENCIL_ZFAIL_KEEP |
+ RADEON_Z_WRITE_ENABLE);
+
+ dev_priv->depth_clear.se_cntl = (RADEON_FFACE_CULL_CW |
+ RADEON_BFACE_SOLID |
+ RADEON_FFACE_SOLID |
+ RADEON_FLAT_SHADE_VTX_LAST |
+
+ RADEON_DIFFUSE_SHADE_FLAT |
+ RADEON_ALPHA_SHADE_FLAT |
+ RADEON_SPECULAR_SHADE_FLAT |
+ RADEON_FOG_SHADE_FLAT |
+
+ RADEON_VTX_PIX_CENTER_OGL |
+ RADEON_ROUND_MODE_TRUNC |
+ RADEON_ROUND_PREC_8TH_PIX);
+
/* FIXME: We want multiple shared areas, including one shared
* only by the X Server and kernel module.
*/
diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.c
index c9bb3eeaf..0113ed97c 100644
--- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.c
+++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.c
@@ -34,7 +34,7 @@
#define RADEON_NAME "radeon"
#define RADEON_DESC "ATI Radeon"
-#define RADEON_DATE "20010103"
+#define RADEON_DATE "20010105"
#define RADEON_MAJOR 1
#define RADEON_MINOR 0
#define RADEON_PATCHLEVEL 0
diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.h b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.h
index 985ebc7ed..06b541991 100644
--- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.h
+++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_drv.h
@@ -52,6 +52,12 @@ typedef struct drm_radeon_ring_buffer {
int space;
} drm_radeon_ring_buffer_t;
+typedef struct drm_radeon_depth_clear_t {
+ u32 rb3d_cntl;
+ u32 rb3d_zstencilcntl;
+ u32 se_cntl;
+} drm_radeon_depth_clear_t;
+
typedef struct drm_radeon_private {
drm_radeon_ring_buffer_t ring;
drm_radeon_sarea_t *sarea_priv;
@@ -85,13 +91,13 @@ typedef struct drm_radeon_private {
u32 crtc_offset;
u32 crtc_offset_cntl;
- unsigned int fb_bpp;
+ unsigned int color_fmt;
unsigned int front_offset;
unsigned int front_pitch;
unsigned int back_offset;
unsigned int back_pitch;
- unsigned int depth_bpp;
+ unsigned int depth_fmt;
unsigned int depth_offset;
unsigned int depth_pitch;
@@ -99,6 +105,8 @@ typedef struct drm_radeon_private {
u32 back_pitch_offset;
u32 depth_pitch_offset;
+ drm_radeon_depth_clear_t depth_clear;
+
drm_map_t *sarea;
drm_map_t *fb;
drm_map_t *mmio;
@@ -353,9 +361,13 @@ extern int radeon_context_switch_complete(drm_device_t *dev, int new);
# define RADEON_BFACE_SOLID (3 << 1)
# define RADEON_FFACE_SOLID (3 << 3)
# define RADEON_FLAT_SHADE_VTX_LAST (3 << 6)
+# define RADEON_DIFFUSE_SHADE_FLAT (1 << 8)
# define RADEON_DIFFUSE_SHADE_GOURAUD (2 << 8)
+# define RADEON_ALPHA_SHADE_FLAT (1 << 10)
# define RADEON_ALPHA_SHADE_GOURAUD (2 << 10)
+# define RADEON_SPECULAR_SHADE_FLAT (1 << 12)
# define RADEON_SPECULAR_SHADE_GOURAUD (2 << 12)
+# define RADEON_FOG_SHADE_FLAT (1 << 14)
# define RADEON_FOG_SHADE_GOURAUD (2 << 14)
# define RADEON_VPORT_XY_XFORM_ENABLE (1 << 24)
# define RADEON_VPORT_Z_XFORM_ENABLE (1 << 25)
diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c
index a7bbaf074..12bd6c796 100644
--- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c
+++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/radeon_state.c
@@ -411,19 +411,17 @@ static void radeon_clear_box( drm_radeon_private_t *dev_priv,
int r, int g, int b )
{
u32 pitch, offset;
- u32 fb_bpp, color;
+ u32 color;
RING_LOCALS;
- switch ( dev_priv->fb_bpp ) {
- case 16:
- fb_bpp = RADEON_GMC_DST_16BPP;
+ switch ( dev_priv->color_fmt ) {
+ case RADEON_COLOR_FORMAT_RGB565:
color = (((r & 0xf8) << 8) |
((g & 0xfc) << 3) |
((b & 0xf8) >> 3));
break;
- case 32:
+ case RADEON_COLOR_FORMAT_ARGB8888:
default:
- fb_bpp = RADEON_GMC_DST_32BPP;
color = (((0xff) << 24) | (r << 16) | (g << 8) | b);
break;
}
@@ -436,7 +434,7 @@ static void radeon_clear_box( drm_radeon_private_t *dev_priv,
OUT_RING( CP_PACKET3( RADEON_CNTL_PAINT_MULTI, 4 ) );
OUT_RING( RADEON_GMC_DST_PITCH_OFFSET_CNTL |
RADEON_GMC_BRUSH_SOLID_COLOR |
- fb_bpp |
+ (dev_priv->color_fmt << 8) |
RADEON_GMC_SRC_DATATYPE_COLOR |
RADEON_ROP3_P |
RADEON_GMC_CLR_CMP_CNTL_DIS );
@@ -495,33 +493,12 @@ static void radeon_cp_dispatch_clear( drm_device_t *dev,
int nbox = sarea_priv->nbox;
drm_clip_rect_t *pbox = sarea_priv->boxes;
unsigned int flags = clear->flags;
- u32 fb_bpp, depth_bpp;
int i;
RING_LOCALS;
DRM_DEBUG( "%s\n", __FUNCTION__ );
radeon_update_ring_snapshot( dev_priv );
- switch ( dev_priv->fb_bpp ) {
- case 16:
- fb_bpp = RADEON_GMC_DST_16BPP;
- break;
- case 32:
- default:
- fb_bpp = RADEON_GMC_DST_32BPP;
- break;
- }
- switch ( dev_priv->depth_bpp ) {
- case 16:
- depth_bpp = RADEON_GMC_DST_16BPP;
- break;
- case 32:
- depth_bpp = RADEON_GMC_DST_32BPP;
- break;
- default:
- return;
- }
-
if ( dev_priv->page_flipping && dev_priv->current_page == 1 ) {
unsigned int tmp = flags;
@@ -537,8 +514,7 @@ static void radeon_cp_dispatch_clear( drm_device_t *dev,
int h = pbox[i].y2 - y;
DRM_DEBUG( "dispatch clear %d,%d-%d,%d flags 0x%x\n",
- pbox[i].x1, pbox[i].y1, pbox[i].x2,
- pbox[i].y2, flags );
+ x, y, w, h, flags );
if ( flags & (RADEON_FRONT | RADEON_BACK) ) {
BEGIN_RING( 4 );
@@ -565,7 +541,7 @@ static void radeon_cp_dispatch_clear( drm_device_t *dev,
OUT_RING( CP_PACKET3( RADEON_CNTL_PAINT_MULTI, 4 ) );
OUT_RING( RADEON_GMC_DST_PITCH_OFFSET_CNTL |
RADEON_GMC_BRUSH_SOLID_COLOR |
- fb_bpp |
+ (dev_priv->color_fmt << 8) |
RADEON_GMC_SRC_DATATYPE_COLOR |
RADEON_ROP3_P |
RADEON_GMC_CLR_CMP_CNTL_DIS );
@@ -585,7 +561,7 @@ static void radeon_cp_dispatch_clear( drm_device_t *dev,
OUT_RING( CP_PACKET3( RADEON_CNTL_PAINT_MULTI, 4 ) );
OUT_RING( RADEON_GMC_DST_PITCH_OFFSET_CNTL |
RADEON_GMC_BRUSH_SOLID_COLOR |
- fb_bpp |
+ (dev_priv->color_fmt << 8) |
RADEON_GMC_SRC_DATATYPE_COLOR |
RADEON_ROP3_P |
RADEON_GMC_CLR_CMP_CNTL_DIS );
@@ -597,49 +573,33 @@ static void radeon_cp_dispatch_clear( drm_device_t *dev,
OUT_RING( (w << 16) | h );
ADVANCE_RING();
+
}
if ( flags & RADEON_DEPTH ) {
- drm_radeon_context_regs_t *ctx =
- &sarea_priv->context_state;
- u32 rb3d_cntl = ctx->rb3d_cntl;
- u32 rb3d_zstencilcntl = ctx->rb3d_zstencilcntl;
- u32 se_cntl = ctx->se_cntl;
+ drm_radeon_depth_clear_t *depth_clear =
+ &dev_priv->depth_clear;
if ( sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS ) {
radeon_emit_state( dev_priv );
}
- /* FIXME: Do re really need to do this? Why
- * not just precalculate all the values?
- */
- rb3d_cntl |= (RADEON_PLANE_MASK_ENABLE |
- RADEON_Z_ENABLE);
-
- rb3d_zstencilcntl |= (RADEON_Z_TEST_ALWAYS |
- RADEON_Z_WRITE_ENABLE);
-
- se_cntl &= ~(RADEON_VPORT_XY_XFORM_ENABLE |
- RADEON_VPORT_Z_XFORM_ENABLE);
- se_cntl |= (RADEON_FFACE_SOLID |
- RADEON_BFACE_SOLID);
-
/* FIXME: Render a rectangle to clear the depth
* buffer. So much for those "fast Z clears"...
*/
- BEGIN_RING( 22 );
+ BEGIN_RING( 23 );
RADEON_WAIT_UNTIL_2D_IDLE();
OUT_RING( CP_PACKET0( RADEON_PP_CNTL, 1 ) );
OUT_RING( 0x00000000 );
- OUT_RING( rb3d_cntl );
+ OUT_RING( depth_clear->rb3d_cntl );
OUT_RING( CP_PACKET0( RADEON_RB3D_ZSTENCILCNTL, 0 ) );
- OUT_RING( rb3d_zstencilcntl );
+ OUT_RING( depth_clear->rb3d_zstencilcntl );
OUT_RING( CP_PACKET0( RADEON_RB3D_PLANEMASK, 0 ) );
OUT_RING( 0x00000000 );
OUT_RING( CP_PACKET0( RADEON_SE_CNTL, 0 ) );
- OUT_RING( se_cntl );
+ OUT_RING( depth_clear->se_cntl );
OUT_RING( CP_PACKET3( RADEON_3D_DRAW_IMMD, 10 ) );
OUT_RING( RADEON_VTX_Z_PRESENT );
@@ -691,7 +651,6 @@ static void radeon_cp_dispatch_swap( drm_device_t *dev )
drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
int nbox = sarea_priv->nbox;
drm_clip_rect_t *pbox = sarea_priv->boxes;
- u32 fb_bpp;
int i;
RING_LOCALS;
DRM_DEBUG( "%s\n", __FUNCTION__ );
@@ -704,19 +663,6 @@ static void radeon_cp_dispatch_swap( drm_device_t *dev )
radeon_cp_performance_boxes( dev_priv );
#endif
- switch ( dev_priv->fb_bpp ) {
- case 16:
- fb_bpp = RADEON_GMC_DST_16BPP;
- break;
- case 24:
- fb_bpp = RADEON_GMC_DST_24BPP;
- break;
- case 32:
- default:
- fb_bpp = RADEON_GMC_DST_32BPP;
- break;
- }
-
/* Wait for the 3D stream to idle before dispatching the bitblt.
* This will prevent data corruption between the two streams.
*/
@@ -732,13 +678,16 @@ static void radeon_cp_dispatch_swap( drm_device_t *dev )
int w = pbox[i].x2 - x;
int h = pbox[i].y2 - y;
+ DRM_DEBUG( "dispatch swap %d,%d-%d,%d\n",
+ x, y, w, h );
+
BEGIN_RING( 7 );
OUT_RING( CP_PACKET3( RADEON_CNTL_BITBLT_MULTI, 5 ) );
OUT_RING( RADEON_GMC_SRC_PITCH_OFFSET_CNTL |
RADEON_GMC_DST_PITCH_OFFSET_CNTL |
RADEON_GMC_BRUSH_NONE |
- fb_bpp |
+ (dev_priv->color_fmt << 8) |
RADEON_GMC_SRC_DATATYPE_COLOR |
RADEON_ROP3_S |
RADEON_DP_SRC_SOURCE_MEMORY |
@@ -1139,7 +1088,7 @@ static void radeon_cp_dispatch_stipple( drm_device_t *dev, u32 *stipple )
drm_radeon_private_t *dev_priv = dev->dev_private;
int i;
RING_LOCALS;
- DRM_INFO( "%s\n", __FUNCTION__ );
+ DRM_DEBUG( "%s\n", __FUNCTION__ );
radeon_update_ring_snapshot( dev_priv );