radeon: Implement EGL_MESA_no_surface_extension
authorJohann Rudloff <cypheon@googlemail.com>
Tue, 27 Jul 2010 20:59:26 +0000 (22:59 +0200)
committerAlex Deucher <alexdeucher@gmail.com>
Tue, 9 Nov 2010 00:59:53 +0000 (19:59 -0500)
src/mesa/drivers/dri/radeon/radeon_common.c
src/mesa/drivers/dri/radeon/radeon_common_context.c

index 43a6355ad8b240ebba4204ad5732ae39411f6deb..7361adffcf7f60ad8501955813ed612afe7c83da 100644 (file)
@@ -171,6 +171,10 @@ void radeonSetCliprects(radeonContextPtr radeon)
 {
        __DRIdrawable *const drawable = radeon_get_drawable(radeon);
        __DRIdrawable *const readable = radeon_get_readable(radeon);
+
+       if(drawable == NULL && readable == NULL)
+               return;
+
        struct radeon_framebuffer *const draw_rfb = drawable->driverPrivate;
        struct radeon_framebuffer *const read_rfb = readable->driverPrivate;
        int x_off, y_off;
index 1047dfae0b3d25c51ef4e47e31deab54730fc784..a436ec112cc4d34d17327573bbac13044f3a140a 100644 (file)
@@ -39,6 +39,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "drirenderbuffer.h"
 #include "drivers/common/meta.h"
 #include "main/context.h"
+#include "main/framebuffer.h"
 #include "main/renderbuffer.h"
 #include "main/state.h"
 #include "main/simple_list.h"
@@ -379,12 +380,12 @@ GLboolean radeonUnbindContext(__DRIcontext * driContextPriv)
 
 static void
 radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
-                                       struct radeon_framebuffer *draw)
+                                       struct gl_framebuffer *draw)
 {
        /* if radeon->fake */
        struct radeon_renderbuffer *rb;
 
-       if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->frontOffset,
@@ -396,7 +397,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
        }
-       if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->backOffset,
@@ -408,7 +409,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
        }
-       if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_DEPTH].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset,
@@ -420,7 +421,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
        }
-       if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_STENCIL].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset,
@@ -436,7 +437,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
 
 static void
 radeon_make_renderbuffer_current(radeonContextPtr radeon,
-                                struct radeon_framebuffer *draw)
+                                struct gl_framebuffer *draw)
 {
        int size = 4096*4096*4;
        /* if radeon->fake */
@@ -448,7 +449,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
        }
 
 
-       if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->frontOffset +
@@ -461,7 +462,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
        }
-       if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->backOffset +
@@ -474,7 +475,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
        }
-       if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_DEPTH].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset +
@@ -487,7 +488,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
                rb->cpp = radeon->radeonScreen->cpp;
                rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
        }
-       if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
+       if ((rb = (void *)draw->Attachment[BUFFER_STENCIL].Renderbuffer)) {
                if (!rb->bo) {
                        rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                                radeon->radeonScreen->depthOffset +
@@ -793,8 +794,8 @@ GLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
                            __DRIdrawable * driReadPriv)
 {
        radeonContextPtr radeon;
-       struct radeon_framebuffer *drfb;
-       struct gl_framebuffer *readfb;
+       struct radeon_framebuffer *rdrfb;
+       struct gl_framebuffer *drfb, *readfb;
 
        if (!driContextPriv) {
                if (RADEON_DEBUG & RADEON_DRI)
@@ -804,17 +805,25 @@ GLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
        }
 
        radeon = (radeonContextPtr) driContextPriv->driverPrivate;
-       drfb = driDrawPriv->driverPrivate;
-       readfb = driReadPriv->driverPrivate;
+
+       if(driDrawPriv == NULL && driReadPriv == NULL) {
+               drfb = _mesa_create_framebuffer(&radeon->glCtx->Visual);
+               readfb = drfb;
+       }
+       else {
+               drfb = driDrawPriv->driverPrivate;
+               readfb = driReadPriv->driverPrivate;
+       }
 
        if (driContextPriv->driScreenPriv->dri2.enabled) {
-               radeon_update_renderbuffers(driContextPriv, driDrawPriv, GL_FALSE);
+               if(driDrawPriv)
+                       radeon_update_renderbuffers(driContextPriv, driDrawPriv, GL_FALSE);
                if (driDrawPriv != driReadPriv)
                        radeon_update_renderbuffers(driContextPriv, driReadPriv, GL_FALSE);
                _mesa_reference_renderbuffer(&radeon->state.color.rb,
-                       &(radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT)->base));
+                       &(radeon_get_renderbuffer(drfb, BUFFER_BACK_LEFT)->base));
                _mesa_reference_renderbuffer(&radeon->state.depth.rb,
-                       &(radeon_get_renderbuffer(&drfb->base, BUFFER_DEPTH)->base));
+                       &(radeon_get_renderbuffer(drfb, BUFFER_DEPTH)->base));
        } else {
                radeon_make_renderbuffer_current(radeon, drfb);
        }
@@ -822,35 +831,40 @@ GLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
        if (RADEON_DEBUG & RADEON_DRI)
             fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb);
 
-       driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
+       if(driDrawPriv)
+               driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
        if (driReadPriv != driDrawPriv)
                driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
 
-       _mesa_make_current(radeon->glCtx, &drfb->base, readfb);
+       _mesa_make_current(radeon->glCtx, drfb, readfb);
+       if (driDrawPriv == NULL && driReadPriv == NULL)
+               _mesa_reference_framebuffer(&drfb, NULL);
 
        _mesa_update_state(radeon->glCtx);
 
-       if (radeon->glCtx->DrawBuffer == &drfb->base) {
-               if (driDrawPriv->swap_interval == (unsigned)-1) {
-                       int i;
-                       driDrawPriv->vblFlags =
-                               (radeon->radeonScreen->irq != 0)
-                               ? driGetDefaultVBlankFlags(&radeon->
-                                                          optionCache)
-                               : VBLANK_FLAG_NO_IRQ;
-
-                       driDrawableInitVBlank(driDrawPriv);
-                       drfb->vbl_waited = driDrawPriv->vblSeq;
-
-                       for (i = 0; i < 2; i++) {
-                               if (drfb->color_rb[i])
-                                       drfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq;
+       if (radeon->glCtx->DrawBuffer == drfb) {
+               if(driDrawPriv != NULL) {
+                       rdrfb = (struct radeon_framebuffer *)drfb;
+                       if (driDrawPriv->swap_interval == (unsigned)-1) {
+                               int i;
+                               driDrawPriv->vblFlags =
+                                       (radeon->radeonScreen->irq != 0)
+                                       ? driGetDefaultVBlankFlags(&radeon->
+                                                                  optionCache)
+                                       : VBLANK_FLAG_NO_IRQ;
+
+                               driDrawableInitVBlank(driDrawPriv);
+                               rdrfb->vbl_waited = driDrawPriv->vblSeq;
+
+                               for (i = 0; i < 2; i++) {
+                                       if (rdrfb->color_rb[i])
+                                               rdrfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq;
+                               }
                        }
-
+                       radeon_window_moved(radeon);
                }
 
-               radeon_window_moved(radeon);
-               radeon_draw_buffer(radeon->glCtx, &drfb->base);
+               radeon_draw_buffer(radeon->glCtx, drfb);
        }