-#ifndef USE_XINERAMA
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
-#else
- side = vmesa->saam & P_MASK;
-
- switch (side) {
- case RightOf:
- /* full in screen 1 */
- if (vmesa->drawX >= vmesa->xsi[0].width) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawX = vmesa->drawX - vmesa->xsi[1].width;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if ((vmesa->drawX + vmesa->drawW) <= vmesa->xsi[0].width) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- case LeftOf:
- /* full in screen 1 */
- if (vmesa->drawX + vmesa->drawW <= 0) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawX = vmesa->drawX + vmesa->xsi[1].width;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if (vmesa->drawX >= 0) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- case Down :
- /* full in screen 1 */
- if (vmesa->drawY >= vmesa->xsi[0].height) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawY = vmesa->drawY - vmesa->xsi[1].height;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if ((vmesa->drawY + vmesa->drawH) <= vmesa->xsi[0].height) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- case Up :
- /* full in screen 1 */
- if ((vmesa->drawY + vmesa->drawH) <= 0) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawY = vmesa->drawY + vmesa->xsi[1].height;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if (vmesa->drawY >= 0) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- default:
- vmesa->viaScreen->fbOffset = 0;
- }
-#endif
-
- {
- GLuint pitch, offset;
- pitch = vmesa->front.pitch;
- offset = vmesa->viaScreen->fbOffset + (vmesa->drawY * pitch + vmesa->drawX * bytePerPixel);
- vmesa->drawXoff = (GLuint)((offset & 0x1f) / bytePerPixel);
- if (vmesa->saam) {
- if (vmesa->pSaamRects) {
- offset = vmesa->viaScreen->fbOffset + (vmesa->pSaamRects[0].y1 * pitch +
- vmesa->pSaamRects[0].x1 * bytePerPixel);
- vmesa->drawXoffSaam = (GLuint)((offset & 0x1f) / bytePerPixel);
- }
- else
- vmesa->drawXoffSaam = 0;
- }
- else
- vmesa->drawXoffSaam = 0;
- }
-
- viaCalcViewport(vmesa->glCtx);
+ if (!drawable)
+ return;
+
+ draw_buffer = (struct via_renderbuffer *) drawable->driverPrivate;
+ read_buffer = (struct via_renderbuffer *) readable->driverPrivate;
+
+ switch (vmesa->glCtx->DrawBuffer->_ColorDrawBufferIndexes[0]) {
+ case BUFFER_BACK_LEFT:
+ if (drawable->numBackClipRects == 0) {
+ vmesa->numClipRects = drawable->numClipRects;
+ vmesa->pClipRects = drawable->pClipRects;
+ }
+ else {
+ vmesa->numClipRects = drawable->numBackClipRects;
+ vmesa->pClipRects = drawable->pBackClipRects;
+ }
+ break;
+ case BUFFER_FRONT_LEFT:
+ vmesa->numClipRects = drawable->numClipRects;
+ vmesa->pClipRects = drawable->pClipRects;
+ break;
+ default:
+ vmesa->numClipRects = 0;
+ break;
+ }
+
+ if ((draw_buffer->drawW != drawable->w)
+ || (draw_buffer->drawH != drawable->h)) {
+ calculate_buffer_parameters(vmesa, vmesa->glCtx->DrawBuffer,
+ drawable);
+ }
+
+ draw_buffer->drawX = drawable->x;
+ draw_buffer->drawY = drawable->y;
+ draw_buffer->drawW = drawable->w;
+ draw_buffer->drawH = drawable->h;
+
+ if (drawable != readable) {
+ if ((read_buffer->drawW != readable->w)
+ || (read_buffer->drawH != readable->h)) {
+ calculate_buffer_parameters(vmesa, vmesa->glCtx->ReadBuffer,
+ readable);
+ }
+
+ read_buffer->drawX = readable->x;
+ read_buffer->drawY = readable->y;
+ read_buffer->drawW = readable->w;
+ read_buffer->drawH = readable->h;
+ }
+
+ vmesa->front.orig = (vmesa->front.offset +
+ draw_buffer->drawY * vmesa->front.pitch +
+ draw_buffer->drawX * bytePerPixel);
+
+ vmesa->front.origMap = (vmesa->front.map +
+ draw_buffer->drawY * vmesa->front.pitch +
+ draw_buffer->drawX * bytePerPixel);
+
+ vmesa->back.orig = (vmesa->back.offset +
+ draw_buffer->drawY * vmesa->back.pitch +
+ draw_buffer->drawX * bytePerPixel);
+
+ vmesa->back.origMap = (vmesa->back.map +
+ draw_buffer->drawY * vmesa->back.pitch +
+ draw_buffer->drawX * bytePerPixel);
+
+ vmesa->depth.orig = (vmesa->depth.offset +
+ draw_buffer->drawY * vmesa->depth.pitch +
+ draw_buffer->drawX * bytePerPixel);
+
+ vmesa->depth.origMap = (vmesa->depth.map +
+ draw_buffer->drawY * vmesa->depth.pitch +
+ draw_buffer->drawX * bytePerPixel);
+
+ viaCalcViewport(vmesa->glCtx);