DRI2: Synchronize the contents of the real and fake front-buffers
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
		
							parent
							
								
									f1a995d149
								
							
						
					
					
						commit
						567cf67959
					
				|  | @ -141,6 +141,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, | ||||||
|     DRI2BufferPtr   buffers; |     DRI2BufferPtr   buffers; | ||||||
|     unsigned int temp_buf[32]; |     unsigned int temp_buf[32]; | ||||||
|     unsigned int *temp = temp_buf; |     unsigned int *temp = temp_buf; | ||||||
|  |     int have_fake_front = 0; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     /* If the drawable is a window and the front-buffer is requested, silently
 |     /* If the drawable is a window and the front-buffer is requested, silently
 | ||||||
|  | @ -163,6 +164,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, | ||||||
| 
 | 
 | ||||||
| 	    if (attachments[i] == DRI2BufferFakeFrontLeft) { | 	    if (attachments[i] == DRI2BufferFakeFrontLeft) { | ||||||
| 		need_fake_front--; | 		need_fake_front--; | ||||||
|  | 		have_fake_front = 1; | ||||||
| 	    } | 	    } | ||||||
| 
 | 
 | ||||||
| 	    temp[i] = attachments[i]; | 	    temp[i] = attachments[i]; | ||||||
|  | @ -171,6 +173,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, | ||||||
| 	if (need_fake_front > 0) { | 	if (need_fake_front > 0) { | ||||||
| 	    temp[i] = DRI2BufferFakeFrontLeft; | 	    temp[i] = DRI2BufferFakeFrontLeft; | ||||||
| 	    count++; | 	    count++; | ||||||
|  | 	    have_fake_front = 1; | ||||||
| 	    attachments = temp; | 	    attachments = temp; | ||||||
| 	} | 	} | ||||||
|     } |     } | ||||||
|  | @ -195,6 +198,25 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, | ||||||
|     *height = pPriv->height; |     *height = pPriv->height; | ||||||
|     *out_count = pPriv->bufferCount; |     *out_count = pPriv->bufferCount; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |     /* If the client is getting a fake front-buffer, pre-fill it with the
 | ||||||
|  |      * contents of the real front-buffer.  This ensures correct operation of | ||||||
|  |      * applications that call glXWaitX before calling glDrawBuffer. | ||||||
|  |      */ | ||||||
|  |     if (have_fake_front) { | ||||||
|  | 	BoxRec box; | ||||||
|  | 	RegionRec region; | ||||||
|  | 
 | ||||||
|  | 	box.x1 = 0; | ||||||
|  | 	box.y1 = 0; | ||||||
|  | 	box.x2 = pPriv->width; | ||||||
|  | 	box.y2 = pPriv->height; | ||||||
|  | 	REGION_INIT(pDraw->pScreen, ®ion, &box, 0); | ||||||
|  | 
 | ||||||
|  | 	DRI2CopyRegion(pDraw, ®ion, DRI2BufferFakeFrontLeft, | ||||||
|  | 		       DRI2BufferFrontLeft); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     return pPriv->buffers; |     return pPriv->buffers; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue