Merge branch 'i915tex_privbuffers' into softpipe_0_1_branch
[mesa.git] / src / mesa / drivers / dri / i915tex / intel_context.c
index f032c97dfbb02382c4fcb27e666f20066492055c..5ab919ecb60605f3409c56d33b2ff2ba4a3f34a9 100644 (file)
 #include "intel_buffer_objects.h"
 #include "intel_fbo.h"
 
+#include "pipe/softpipe/sp_context.h"
+#include "state_tracker/st_public.h"
+
+
 #include "drirenderbuffer.h"
 #include "vblank.h"
 #include "utils.h"
@@ -257,6 +261,9 @@ intelInvalidateState(GLcontext * ctx, GLuint new_state)
    _vbo_InvalidateState(ctx, new_state);
    _tnl_InvalidateState(ctx, new_state);
    _tnl_invalidate_vertex_state(ctx, new_state);
+
+   st_invalidate_state( ctx, new_state );
+
    intel_context(ctx)->NewGLState |= new_state;
 }
 
@@ -504,6 +511,11 @@ intelInitContext(struct intel_context *intel,
       FALLBACK(intel, INTEL_FALLBACK_USER, 1);
    }
 
+
+   st_create_context( &intel->ctx,
+                     softpipe_create() );
+   
+
    return GL_TRUE;
 }
 
@@ -605,12 +617,23 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
       if (intel->ctx.DrawBuffer == &intel_fb->Base) {
 
         if (intel->driDrawable != driDrawPriv) {
-           intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
-              ? driGetDefaultVBlankFlags(&intel->optionCache)
-              : VBLANK_FLAG_NO_IRQ;
-           (*dri_interface->getUST) (&intel_fb->swap_ust);
-           driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
-                                 &intel_fb->vbl_seq);
+           if (driDrawPriv->pdraw->swap_interval == (unsigned)-1) {
+              int i;
+
+              intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
+                 ? driGetDefaultVBlankFlags(&intel->optionCache)
+                : VBLANK_FLAG_NO_IRQ;
+
+              (*dri_interface->getUST) (&intel_fb->swap_ust);
+              driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
+                                    &intel_fb->vbl_seq);
+              intel_fb->vbl_waited = intel_fb->vbl_seq;
+
+              for (i = 0; i < 2; i++) {
+                 if (intel_fb->color_rb[i])
+                    intel_fb->color_rb[i]->vbl_pending = intel_fb->vbl_seq;
+              }
+           }
         }
       }
 
@@ -660,37 +683,27 @@ intelContendedLock(struct intel_context *intel, GLuint flags)
    if (sarea->width != intel->width ||
        sarea->height != intel->height ||
        sarea->rotation != intel->current_rotation) {
-      
-      void *batchMap = intel->batch->map;
-      
+      int numClipRects = intel->numClipRects;
+
       /*
        * FIXME: Really only need to do this when drawing to a
        * common back- or front buffer.
        */
 
       /*
-       * This will drop the outstanding batchbuffer on the floor
+       * This will essentially drop the outstanding batchbuffer on the floor.
        */
+      intel->numClipRects = 0;
 
-      if (batchMap != NULL) {
-        driBOUnmap(intel->batch->buffer);
-        intel->batch->map = NULL;
-      }
-
-      intel_batchbuffer_reset(intel->batch);
+      if (intel->Fallback)
+        _swrast_flush(&intel->ctx);
 
-      if (batchMap == NULL) {
-        driBOUnmap(intel->batch->buffer);
-        intel->batch->map = NULL;
-      }
+      INTEL_FIREVERTICES(intel);
 
-      /* lose all primitives */
-      intel->prim.primitive = ~0;
-      intel->prim.start_ptr = 0;
-      intel->prim.flush = 0;
+      if (intel->batch->map != intel->batch->ptr)
+        intel_batchbuffer_flush(intel->batch);
 
-      /* re-emit all state */
-      intel->vtbl.lost_hardware(intel);
+      intel->numClipRects = numClipRects;
 
       /* force window update */
       intel->lastStamp = 0;
@@ -724,7 +737,9 @@ void LOCK_HARDWARE( struct intel_context *intel )
                                    BUFFER_BACK_LEFT);
     }
 
-    if (intel_rb && (intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
+    if (intel_rb && intel_fb->vblank_flags &&
+       !(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) &&
+       (intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
        drmVBlank vbl;
 
        vbl.request.type = DRM_VBLANK_ABSOLUTE;