1 /************************************************************************** 2 * 3 * Copyright 2003 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #include "intel_context.h" 29 #include "intel_buffers.h" 30 #include "intel_fbo.h" 31 #include "intel_mipmap_tree.h" 32 33 #include "main/fbobject.h" 34 #include "main/framebuffer.h" 35 #include "main/renderbuffer.h" 36 37 /** 38 * Check if we're about to draw into the front color buffer. 39 * If so, set the intel->front_buffer_dirty field to true. 40 */ 41 void 42 intel_check_front_buffer_rendering(struct intel_context *intel) 43 { 44 const struct gl_framebuffer *fb = intel->ctx.DrawBuffer; 45 if (_mesa_is_winsys_fbo(fb)) { 46 /* drawing to window system buffer */ 47 if (fb->_NumColorDrawBuffers > 0) { 48 if (fb->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT) { 49 intel->front_buffer_dirty = true; 50 } 51 } 52 } 53 } 54 55 static void 56 intelDrawBuffer(struct gl_context * ctx, GLenum mode) 57 { 58 if (_mesa_is_front_buffer_drawing(ctx->DrawBuffer)) { 59 struct intel_context *const intel = intel_context(ctx); 60 61 /* If we might be front-buffer rendering on this buffer for the first 62 * time, invalidate our DRI drawable so we'll ask for new buffers 63 * (including the fake front) before we start rendering again. 64 */ 65 dri2InvalidateDrawable(intel->driContext->driDrawablePriv); 66 } 67 68 intel_draw_buffer(ctx); 69 } 70 71 72 static void 73 intelReadBuffer(struct gl_context * ctx, GLenum mode) 74 { 75 if (_mesa_is_front_buffer_reading(ctx->ReadBuffer)) { 76 struct intel_context *const intel = intel_context(ctx); 77 78 /* If we might be front-buffer reading on this buffer for the first 79 * time, invalidate our DRI drawable so we'll ask for new buffers 80 * (including the fake front) before we start reading again. 81 */ 82 dri2InvalidateDrawable(intel->driContext->driReadablePriv); 83 } 84 } 85 86 87 void 88 intelInitBufferFuncs(struct dd_function_table *functions) 89 { 90 functions->DrawBuffer = intelDrawBuffer; 91 functions->ReadBuffer = intelReadBuffer; 92 } 93