diff options
Diffstat (limited to 'src/mesa/drivers/dri/r128/r128_state.c')
-rw-r--r-- | src/mesa/drivers/dri/r128/r128_state.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/r128/r128_state.c b/src/mesa/drivers/dri/r128/r128_state.c index 1b2c2a5284e..491f288ffb2 100644 --- a/src/mesa/drivers/dri/r128/r128_state.c +++ b/src/mesa/drivers/dri/r128/r128_state.c @@ -599,8 +599,26 @@ static void r128UpdateClipping( GLcontext *ctx ) x2 += drawable->x; y2 += drawable->y; - rmesa->setup.sc_top_left_c = ((y1 << 16) | x1); - rmesa->setup.sc_bottom_right_c = ((y2 << 16) | x2); + /* Clamp values to screen to avoid wrapping problems */ + if ( x1 < 0 ) + x1 = 0; + else if ( x1 >= rmesa->driScreen->fbWidth ) + x1 = rmesa->driScreen->fbWidth - 1; + if ( y1 < 0 ) + y1 = 0; + else if ( y1 >= rmesa->driScreen->fbHeight ) + y1 = rmesa->driScreen->fbHeight - 1; + if ( x2 < 0 ) + x2 = 0; + else if ( x2 >= rmesa->driScreen->fbWidth ) + x2 = rmesa->driScreen->fbWidth - 1; + if ( y2 < 0 ) + y2 = 0; + else if ( y2 >= rmesa->driScreen->fbHeight ) + y2 = rmesa->driScreen->fbHeight - 1; + + rmesa->setup.sc_top_left_c = (((y1 & 0x3FFF) << 16) | (x1 & 0x3FFF)); + rmesa->setup.sc_bottom_right_c = (((y2 & 0x3FFF) << 16) | (x2 & 0x3FFF)); rmesa->dirty |= R128_UPLOAD_CONTEXT; } @@ -798,8 +816,8 @@ static void r128UpdateWindow( GLcontext *ctx ) struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[0][0]; driRenderbuffer *drb = (driRenderbuffer *) rb; - rmesa->setup.window_xy_offset = ((y << R128_WINDOW_Y_SHIFT) | - (x << R128_WINDOW_X_SHIFT)); + rmesa->setup.window_xy_offset = (((y & 0xFFF) << R128_WINDOW_Y_SHIFT) | + ((x & 0xFFF) << R128_WINDOW_X_SHIFT)); rmesa->setup.dst_pitch_offset_c = (((drb->flippedPitch/8) << 21) | (drb->flippedOffset >> 5)); @@ -1122,6 +1140,15 @@ void r128EmitHwStateLocked( r128ContextPtr rmesa ) R128_UPLOAD_WINDOW | R128_UPLOAD_CORE) ) { memcpy( &sarea->context_state, regs, sizeof(sarea->context_state) ); + + if( rmesa->dirty & R128_UPLOAD_CONTEXT ) + { + /* One possible side-effect of uploading a new context is the + * setting of the R128_GMC_AUX_CLIP_DIS bit, which causes all + * auxilliary cliprects to be disabled. So the next command must + * upload them again. */ + rmesa->dirty |= R128_UPLOAD_CLIPRECTS; + } } if ( (rmesa->dirty & R128_UPLOAD_TEX0) && t0 ) { @@ -1207,7 +1234,10 @@ void r128DDUpdateHWState( GLcontext *ctx ) r128UpdateMasks( ctx ); if ( new_state & R128_NEW_WINDOW ) + { r128UpdateWindow( ctx ); + r128CalcViewport( ctx ); + } if ( rmesa->NewGLState & _NEW_TEXTURE ) { r128UpdateTextureState( ctx ); |