graphicscomposition/openwfcompositionengine/composition/src/wfccontext.c
branchRCL_3
changeset 20 25ffed67c7ef
parent 19 bbf46f59e123
--- a/graphicscomposition/openwfcompositionengine/composition/src/wfccontext.c	Tue Aug 31 16:31:06 2010 +0300
+++ b/graphicscomposition/openwfcompositionengine/composition/src/wfccontext.c	Wed Sep 01 12:39:21 2010 +0100
@@ -1,5 +1,4 @@
 /* Copyright (c) 2009 The Khronos Group Inc.
- * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and/or associated documentation files (the
@@ -61,6 +60,8 @@
 #define AUTO_COMPOSE_DELAY      15000
 #define FIRST_CONTEXT_HANDLE    2000
 
+#define WAIT_FOREVER            -1
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -111,6 +112,7 @@
     fInt.linear         = fExt.linear;
     fInt.premultiplied  = fExt.premultiplied;
     fInt.rowPadding     = 1;
+    
      
     if (context->type == WFC_CONTEXT_TYPE_ON_SCREEN)
         {
@@ -119,7 +121,7 @@
         /* The rotated version of the target buffer for hardware rotation
          * or a de-rotated version of the internal buffer into another scratch buffer for software rotation
          */ 
-        if (OWF_Screen_Rotation_Supported(context->displayContext))
+        if (OWF_Screen_Rotation_Supported(context->screenNumber))
             {   /* The rotated version of the target buffer for hardware rotation */
             context->state.rotatedTargetImage=OWF_Image_Create(context->targetHeight,context->targetWidth,&fExt,context->scratchBuffer[2],0);
             }
@@ -225,13 +227,9 @@
     DPRINT(("WFC_Context_Shutdown(context = %d)", context->handle));
 
     DPRINT(("Waiting for composer thread termination"));
-    if (context->composerThread)
-        {
-        OWF_Message_Send(&context->composerQueue, WFC_MESSAGE_QUIT, 0);
-        OWF_Thread_Join(context->composerThread, NULL);
-        OWF_Thread_Destroy(context->composerThread);
-        }
-    
+    OWF_Message_Send(&context->composerQueue, WFC_MESSAGE_QUIT, 0);
+    OWF_Thread_Join(context->composerThread, NULL);
+    OWF_Thread_Destroy(context->composerThread);
     context->composerThread = NULL;
 
     if (context->device)
@@ -281,9 +279,8 @@
         OWF_ASSERT(attribError==ATTR_ERROR_NO_MEMORY);
         return attribError;
         }
-
-  
-    /* The composition code reads the member variables directly, 
+    
+    /* The composition code uses the member variables directly, 
      * not via the attribute engine.
      */
     OWF_Attribute_Initi(&context->attributes,
@@ -316,14 +313,6 @@
                         (OWFint*) &context->lowestElement,
                         OWF_TRUE);
     attribError=OWF_AttributeList_GetError(&context->attributes);
-	
-	/* After commit to working, writable attribute abstracted variables
-	must not be written to directly. */
-    OWF_AttributeList_Commit(&context->attributes,
-                             WFC_CONTEXT_TYPE,
-                             WFC_CONTEXT_BG_COLOR,
-		             WORKING_ATTR_VALUE_INDEX );
-	
     return attribError;
 }
 
@@ -372,86 +361,67 @@
         return NULL;
         }
 
-    err2 =OWF_MessageQueue_Init(&context->composerQueue);
-    if (err2 != 0)
-        {
-        DPRINT(("WFC_Context_Initialize(): Cannot initialise the message queue err(%d)", err2));   
-        return NULL;
-        }
-    
-    context->composerThread = OWF_Thread_Create(WFC_Context_ComposerThread, context);
-    if (!(context->composerThread))
-        {
-        /* must call these to remove references to context */
-        DPRINT(("WFC_Context_Initialize(): Failed to create thread!"));
-        return NULL;
-        }
-
-    OWF_ComposerThread_RendezvousWait(context->displayContext);
-    
-    /*the following section of the code could be pushed to adaptation in future*/
+     /*the following section of the code could be pushed to adaptation in future*/
     if (type == WFC_CONTEXT_TYPE_ON_SCREEN)
     {
-       OWF_IMAGE_FORMAT        imageFormat;
-       OWF_SCREEN              screen;
-       WFCint width = 0;
-       WFCint height = 0;
-       WFCint normalSize = 0;
-       WFCint flippedSize = 0;
-       WFCNativeStreamType stream;
-    
-       /* Set up stream for sending data to screen */
-       
-       if (!OWF_Screen_GetHeader(context->displayContext, &screen))
-       {
-           DPRINT(("WFC_Context_Initialize(): Could not retrieve the screen parameters"));
-           WFC_Context_Shutdown(context);
-           return NULL;
-       }
-    
-       /* Set on-screen pixel format */
-       imageFormat.pixelFormat     = OWF_SURFACE_PIXEL_FORMAT;
-       imageFormat.premultiplied   = OWF_SURFACE_PREMULTIPLIED;
-       imageFormat.linear          = OWF_SURFACE_LINEAR;
-       imageFormat.rowPadding      = OWF_SURFACE_ROWPADDING;
+        OWF_IMAGE_FORMAT        imageFormat;
+        OWF_SCREEN              screen;
+        WFCint width = 0;
+        WFCint height = 0;
+        WFCint normalSize = 0;
+        WFCint flippedSize = 0;
+        WFCNativeStreamType stream;
     
-       width = screen.normal.width;
-       height = screen.normal.height;
-       
-       normalSize = screen.normal.height * screen.normal.stride;
-       flippedSize = screen.flipped.height * screen.flipped.stride;
-       
-       if (flippedSize > normalSize)
-           {
-           width = screen.flipped.width;
-           height = screen.flipped.height;
-           }
-       
-       stream = owfNativeStreamCreateImageStream(width,
-                                                 height,
-                                                 &imageFormat,
-                                                 1);
-    
-       if (stream)
-       {
-           WFC_Context_SetTargetStream(context, stream);
-           
-           /* At this point the stream's refcount is 2 - we must decrement
-            * it by one to ensure that the stream is destroyed when the
-            * context (that "owns" it) is destroyed.
-            */
-           owfNativeStreamRemoveReference(stream);
-       }
-       else
-       {
-           DPRINT(("WFC_Context_Initialize(): cannot create internal target stream"));
-           WFC_Context_Shutdown(context);
-           return NULL;
-       }
+        /* Set up stream for sending data to screen */
+        
+        if (!OWF_Screen_GetHeader(screenNum, &screen))
+        {
+            DPRINT(("WFC_Context_Initialize(): Could not retrieve the screen parameters"));
+            return NULL;
+        }
+
+        /* Set on-screen pixel format */
+        imageFormat.pixelFormat     = OWF_SURFACE_PIXEL_FORMAT;
+        imageFormat.premultiplied   = OWF_SURFACE_PREMULTIPLIED;
+        imageFormat.linear          = OWF_SURFACE_LINEAR;
+        imageFormat.rowPadding      = OWF_SURFACE_ROWPADDING;
+
+        width = screen.normal.width;
+        height = screen.normal.height;
+        
+        normalSize = screen.normal.height * screen.normal.stride;
+        flippedSize = screen.flipped.height * screen.flipped.stride;
+        
+        if (flippedSize > normalSize)
+            {
+            width = screen.flipped.width;
+            height = screen.flipped.height;
+            }
+        
+        stream = owfNativeStreamCreateImageStream(width,
+                                                  height,
+                                                  &imageFormat,
+                                                  1);
+
+        if (stream)
+        {
+            WFC_Context_SetTargetStream(context, stream);
+            
+            /* At this point the stream's refcount is 2 - we must decrement
+             * it by one to ensure that the stream is destroyed when the
+             * context (that "owns" it) is destroyed.
+             */
+            owfNativeStreamRemoveReference(stream);
+        }
+        else
+        {
+            DPRINT(("WFC_Context_Initialize(): cannot create internal target stream"));
+            return NULL;
+        }
     }
     else
     {
-       WFC_Context_SetTargetStream(context, stream);
+        WFC_Context_SetTargetStream(context, stream);
     }
     
     nbufs = SCRATCH_BUFFER_COUNT-1;
@@ -472,13 +442,17 @@
                                          OWF_IMAGE_L32);
     fail = fail || (scratch[nbufs] == NULL);
     
+    err2 = OWF_MessageQueue_Init(&context->composerQueue);
+    fail = fail || (err2 != 0);
+
     if (fail)
     {
+        OWF_MessageQueue_Destroy(&context->composerQueue);
+
         for (ii = 0; ii < SCRATCH_BUFFER_COUNT; ii++)
         {
             OWF_Image_FreeData(context->displayContext, &scratch[ii]);
         }
-        WFC_Context_Shutdown(context);
         return NULL;
     }
 
@@ -486,7 +460,12 @@
     {
         context->scratchBuffer[ii] = scratch[ii];
     }
-    
+
+    if (!WFC_Pipeline_CreateState(context) || !WFC_Context_CreateState(context))
+         {
+         DPRINT(("WFC_Context_Initialize(): Could not create pipeline state object"));
+         return NULL;
+         }
     if (    OWF_Semaphore_Init(&context->compositionSemaphore, 1)
         ||  OWF_Semaphore_Init(&context->commitSemaphore, 1)
         ||  OWF_Mutex_Init(&context->updateFlagMutex)
@@ -495,23 +474,13 @@
         )
         {
         DPRINT(("WFC_Context_Initialize(): Could not create mutexes and semaphores!"));
-        WFC_Context_Shutdown(context);
         return NULL;
         }
 
-    if (!WFC_Pipeline_CreateState(context) || !WFC_Context_CreateState(context))
-         {
-         DPRINT(("WFC_Context_Initialize(): Could not create pipeline state object"));
-         WFC_Context_Shutdown(context);
-         return NULL;
-         }
-    
-
     attribStatus= WFC_Context_InitializeAttributes(context, type);
 
     if (attribStatus!=ATTR_ERROR_NONE)
         {
-        WFC_Context_Shutdown(context);
         return NULL;
         }
     
@@ -525,7 +494,9 @@
     if (!( context->scenePool &&
           context->nodePool && context->elementPool))
     {
-        WFC_Context_Shutdown(context);
+        /* must call these to remove references to context */
+        context->workScene = NULL;
+        context->committedScene = NULL;
         return NULL;
     }
 
@@ -541,10 +512,27 @@
     if (!(context->workScene && context->committedScene &&
           context->nodePool && context->elementPool))
     {
-        WFC_Context_Shutdown(context);
+        /* must call these to remove references to context */
+        WFC_Scene_Destroy(context->workScene);
+        WFC_Scene_Destroy(context->committedScene);
+        context->workScene = NULL;
+        context->committedScene = NULL;
         return NULL;
     }
 
+
+    context->composerThread = OWF_Thread_Create(WFC_Context_ComposerThread,
+                                                context);
+    if (!(context->composerThread))
+        {
+        /* must call these to remove references to context */
+        WFC_Scene_Destroy(context->workScene);
+        WFC_Scene_Destroy(context->committedScene);
+        context->workScene = NULL;
+        context->committedScene = NULL;
+        return NULL;
+        }
+    
     return context;
 }
 
@@ -565,7 +553,7 @@
     WFC_CONTEXT*            context = NULL;
 
     OWF_ASSERT(device);
-    context = CREATE(WFC_CONTEXT);
+   context = CREATE(WFC_CONTEXT);
 
     if (context)
     {
@@ -596,182 +584,6 @@
                              &context->targetWidth, &context->targetHeight,
                              NULL, NULL, NULL);
 }
-
-static OWFboolean
-WFC_FastpathCheckTransparency(WFCbitfield transparencyTypes, WFCfloat globalAlpha, OWF_PIXEL_FORMAT sourceFormat)
-    {
-    if ((transparencyTypes & WFC_TRANSPARENCY_ELEMENT_GLOBAL_ALPHA) && (globalAlpha != 255.0f))
-        {
-        DPRINT(("=== WFC_FastpathCheckTransparency - Failed global alfa(%f) check", globalAlpha));
-        return OWF_FALSE;
-        }
-
-    if ((transparencyTypes & WFC_TRANSPARENCY_SOURCE) && (sourceFormat != OWF_IMAGE_XRGB8888))
-        {
-        DPRINT(("=== WFC_FastpathCheckTransparency - Failed transparency check types=0x%x format=0x%x", 
-                transparencyTypes, sourceFormat));
-        return OWF_FALSE;
-        }
-    
-
-    return OWF_TRUE;
-    }
-
-static OWFboolean
-WFC_FastpathCheckGeometry(WFC_CONTEXT* context, WFC_ELEMENT* element)
-    {
-    OWFint sourceWidth = 0;
-    OWFint sourceHeight = 0;
-    OWFint destWidth = 0;
-    OWFint destHeight = 0;
-    OWFint targetWidth = 0;
-    OWFint targetHeight = 0;
-    
-    OWF_ASSERT(context);
-    OWF_ASSERT(element);
-
-    if ((element->srcRect[0] != 0) || (element->srcRect[1] != 0))
-        {
-        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Source Position Check", context));
-        return OWF_FALSE;
-        }
-    
-    if ((element->dstRect[0] != 0) || (element->dstRect[1] != 0))
-        {
-        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Destination Position Check", context));
-        return OWF_FALSE;
-        }
-    
-    if(element->sourceFlip)
-        {
-        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Source Flip Check", context));
-        return OWF_FALSE;
-        }
-    
-    if(element->sourceRotation == WFC_ROTATION_0)
-        {
-        sourceWidth = element->srcRect[2];
-        sourceHeight = element->srcRect[3];
-        }
-    else
-        {
-        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Source Rotation (0x%x) Check", 
-                context, element->sourceRotation));
-        return OWF_FALSE;
-        }
-    
-    destWidth = element->dstRect[2];
-    destHeight = element->dstRect[3];
-    
-    if ((sourceWidth != destWidth) || (sourceHeight != destHeight))
-       {
-       DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - FAILED Non-scaling Check", context));
-       return OWF_FALSE;
-       }
-
-    if (context->rotation == WFC_ROTATION_0 || OWF_Screen_Rotation_Supported(context->displayContext))
-        {
-        if (context->rotation == WFC_ROTATION_0 || context->rotation == WFC_ROTATION_180)
-            {
-            targetWidth = context->targetWidth;
-            targetHeight = context->targetHeight;
-            }
-        else
-            {
-            targetWidth = context->targetHeight;
-            targetHeight = context->targetWidth;
-            }
-        
-        if (destWidth == targetWidth && destHeight == targetHeight)
-            {
-            return OWF_TRUE;
-            }
-        else
-            {
-            DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - Failed Dimensions Check", context));
-            }
-        }
-    else
-        {
-        DPRINT(("=== WFC_FastpathCheckGeometry(context = %p) - Failed Supported Rotations Check", context));
-        }
-    
-    return OWF_FALSE;
-    }
-
-/**
- * Check if the current scene is candidate for fastpath optimisation.
- * Fastpath optimisation means the topmost visible layer will be passed direct to the 
- * lower level for presentation on the display without being composed.
- * There are two questions:
- * - Is the scene itself suitable for fastpathing?
- * - Can the surface selected for fastpathing be presented directly by the display?
- * This function will check the scene (eg reject if the top stream is non-opaque or smaller than the screen)
- *
- * @param context context object containing the scene to be checked.
- **/
-
-/* [Not in doxygen]
- * The first time MOpenWFC_RI_Display_Update::SetTopLayerSurface (or SetLayerSurface) is called 
- * with a different stream handle, it can fail indicating the display cannot accept the stream.
- * The compositor will then have to immediately compose that frame as normal, and should continue
- * to perform normal composition until the scene changes to present a different stream as fastpath candidate.  
- * 
- * There is a middle ground, e.g. can the hardware handle over-sized images, or do scaling or do rotation?
- * SetTopLayerSurface accepts an optional list of imperfect attributes to be checked by the adaptation.
- * By WFC_Context_CheckFastpath only listing the attributes that are considered imperfect,
- * and SetLayerSurface rejecting fastpath for any attribute IDs that it doesn't recognise,
- * safe independent extensibility is assured. 
- */
-static void
-WFC_Context_CheckFastpath(WFC_CONTEXT* context)
-    {
-    WFC_ELEMENT* element = NULL;
-    OWF_ASSERT(context);
-    
-    DPRINT(("WFC_Context_CheckFastpath(context = %p) - Check Fastpath", context));
-    if ((context->type != WFC_CONTEXT_TYPE_ON_SCREEN) ||
-        OWF_DisplayContext_FastpathChecked(context->displayContext))
-        {
-        return;
-        }
-    
-    // Simple case-fast path top most layer
-    // More complex case, fast-path top most VISIBLE, OPAQUE layer.
-    OWF_DisplayContext_DisableFastpath(context->displayContext);
-    OWF_DisplayContext_SetFastpathChecked(context->displayContext);
-    // Find top layer
-    element = WFC_Scene_TopMostElement(context->committedScene);
-    if (element && element->source && element->skipCompose == WFC_FALSE)
-        {
-    
-        if (element->mask)
-            {
-            DPRINT(("=== WFC_Context_CheckFastpath(context = %p) - FAILED elemenent includes mask", context));
-            return;
-            }
-        
-        OWF_ASSERT(element->source->lockedStream.image);
-        
-        OWF_ASSERT(element->source->streamHandle != OWF_INVALID_HANDLE);
-        
-        if (!WFC_FastpathCheckGeometry(context, element))
-            {
-            return;
-            }
-        
-        if (!WFC_FastpathCheckTransparency(element->transparencyTypes, 
-                                           element->globalAlpha, 
-                                           element->source->lockedStream.image->format.pixelFormat))
-            {
-            return;
-            }
-        
-        OWF_DisplayContext_EnableFastpath(context->displayContext, element->source->streamHandle);
-        DPRINT(("=== WFC_Context_CheckFastpath(context = %p) - Fastpath Enabled", context));
-        }
-    }
-
 /*---------------------------------------------------------------------------
  * Checks if the given stream would be valid as an off-screen context target.
  * 
@@ -888,7 +700,7 @@
 /*---------------------------------------------------------------------------
  *
  *----------------------------------------------------------------------------*/
-static OWFboolean
+static void
 WFC_Context_LockTargetForWriting(WFC_CONTEXT* context)
 {
     OWF_ASSERT(context);
@@ -897,18 +709,12 @@
 
     context->state.targetBuffer =
         owfNativeStreamAcquireWriteBuffer(context->stream);
-    
-    if (!context->state.targetBuffer)
-        {
-        DPRINT(("Failed to WFC_Context_LockTargetForWriting owfNativeStreamAcquireWriteBuffer"));
-        return OWF_FALSE;
-        }
     context->state.targetPixels =
         owfNativeStreamGetBufferPtr(context->stream,
                                     context->state.targetBuffer);
 
     if ((WFC_ROTATION_0   == context->rotation || WFC_ROTATION_180 == context->rotation) ||
-        !OWF_Screen_Rotation_Supported(context->displayContext))
+        !OWF_Screen_Rotation_Supported(context->screenNumber))
     {
         /* final target, in target format */
         context->state.targetImage =context->state.unrotatedTargetImage;
@@ -941,15 +747,16 @@
         {
         OWF_ASSERT(WFC_FALSE);
         }
-    return OWF_TRUE;
 }
 
 /*---------------------------------------------------------------------------
  *
  *----------------------------------------------------------------------------*/
 static void
-WFC_Context_UnlockTarget(WFC_CONTEXT* context,OWFboolean aDoPost)
+WFC_Context_UnlockTarget(WFC_CONTEXT* context)
 {
+    OWFNativeStreamBuffer   frontBuffer = OWF_INVALID_HANDLE;
+    void*                   pixelDataPtr = NULL;
     OWF_ROTATION rotation = OWF_ROTATION_0;
 
     OWF_ASSERT(context);
@@ -963,42 +770,49 @@
                                       NULL);
 
     
-    if (aDoPost)
+    /* Refactor the code that follows so that it is triggered by the above releasewrite */
+    
+    /* Acquire target stream front buffer and blit to SDL screen */
+    frontBuffer = owfNativeStreamAcquireReadBuffer(context->stream);
+    DPRINT(("  Locking target stream=%d, buffer=%d",
+            context->stream, frontBuffer));
+
+    pixelDataPtr = owfNativeStreamGetBufferPtr(context->stream, frontBuffer);
+
+    switch (context->rotation)
     {
-        switch (context->rotation)
+        case WFC_ROTATION_0:
+        {
+            rotation = OWF_ROTATION_0;
+            break;
+        }
+        case WFC_ROTATION_90:
         {
-            case WFC_ROTATION_0:
-            {
-                rotation = OWF_ROTATION_0;
-                break;
-            }
-            case WFC_ROTATION_90:
-            {
-                rotation = OWF_ROTATION_90;
-                break;
-            }
-            case WFC_ROTATION_180:
-            {
-                rotation = OWF_ROTATION_180;
-                break;
-            }
-            case WFC_ROTATION_270:
-            {
-                rotation = OWF_ROTATION_270;
-                break;
-            }
-            default:
-            {
-                OWF_ASSERT(0);
-            }
+            rotation = OWF_ROTATION_90;
+            break;
+        }
+        case WFC_ROTATION_180:
+        {
+            rotation = OWF_ROTATION_180;
+            break;
+        }
+        case WFC_ROTATION_270:
+        {
+            rotation = OWF_ROTATION_270;
+            break;
         }
-        
-        if (!OWF_Screen_Post_Topmost_Layer(context->displayContext, context->stream, rotation))
-            {   //getting a fail here is bad... display did not accept the composition buffer.
-            DPRINT(("WFC_Context_UnlockTarget - OWF_Screen_Post_Topmost_Layer failed for composition stream"));
-           OWF_ASSERT(0);
-            }
+        default:
+        {
+            OWF_ASSERT(0);
+        }
     }
+    
+    OWF_Screen_Blit(context->screenNumber, pixelDataPtr, rotation);
+
+    owfNativeStreamReleaseReadBuffer(context->stream, frontBuffer);
+    DPRINT(("  Releasing target stream=%d, buffer=%d",
+            context->stream, frontBuffer));
+
 }
 
 /*---------------------------------------------------------------------------
@@ -1034,6 +848,8 @@
     b = b * a / OWF_ALPHA_MAX_VALUE;
 
     OWF_Image_Clear(context->state.internalTargetImage, r, g, b, a);
+
+    WFC_Scene_LockSourcesAndMasks(context->committedScene);
 }
 
 
@@ -1045,11 +861,13 @@
 WFC_Context_FinishComposition(WFC_CONTEXT* context)
 {
     OWF_ROTATION            rotation = OWF_ROTATION_0;
+    OWFint                  screenNumber;
     OWFboolean              screenRotation;
 
     OWF_ASSERT(context);
 
-    screenRotation = OWF_Screen_Rotation_Supported(context->displayContext);
+    screenNumber = context->screenNumber;
+    screenRotation = OWF_Screen_Rotation_Supported(screenNumber);
     /* re-use scratch buffer 1 for context rotation */
     if (WFC_ROTATION_0   == context->rotation || screenRotation)
     {
@@ -1106,7 +924,8 @@
 
         OWF_Image_DestinationFormatConversion(context->state.targetImage, context->state.rotatedTargetImage);
     }
-    WFC_Context_UnlockTarget(context,(context->type==WFC_CONTEXT_TYPE_ON_SCREEN)?OWF_TRUE:OWF_FALSE);
+    WFC_Context_UnlockTarget(context);
+    WFC_Scene_UnlockSourcesAndMasks(context->committedScene);
 }
 
 /*!---------------------------------------------------------------------------
@@ -1131,167 +950,56 @@
     context->sourceUpdateCount = 0;
     OWF_Mutex_Unlock(&context->updateFlagMutex);
     
+    WFC_Context_PrepareComposition(context);
+
     DPRINT(("WFC_Context_Compose"));
     /* Composition always uses the committed version
      * of the scene.
      */
 
-    WFC_Scene_LockSourcesAndMasks(context->committedScene);
-    
     OWF_Mutex_Lock(&context->sceneMutex);
     
-    WFC_Context_CheckFastpath(context);
-    if (OWF_DisplayContext_FastpathEnabled(context->displayContext))
+    scene = context->committedScene;
+    OWF_ASSERT(scene);
+
+    for (node = scene->elements; NULL != node; node = node->next)
+    {
+        
+        WFC_ELEMENT*            element = NULL;
+        WFC_ELEMENT_STATE*      elementState = NULL;
+        element = ELEMENT(node->data);
+
+        if (element->skipCompose)
         {
-        WFCboolean targetStreamAccessed;
-        OWFboolean screenRotation;
-        screenRotation = OWF_Screen_Rotation_Supported(context->displayContext);
-        if (WFC_Context_Active(context))
-            {   //Full fastpath is only supported for autonomous composition 
-            OWFNativeStreamType stream = OWF_INVALID_HANDLE;
-            OWF_ROTATION rotation = OWF_ROTATION_0;
-    
-            DPRINT(("== WFC_Context_DoCompose(context = %p) - Fastpathing", context));
-    
-            stream = OWF_DisplayContext_FastpathStream(context->displayContext);
-            if (screenRotation)
-                {
-                switch (context->rotation)
-                    {
-                    case WFC_ROTATION_0:
-                        {
-                        rotation = OWF_ROTATION_0;
-                        break;
-                        }
-                    case WFC_ROTATION_90:
-                        {
-                        rotation = OWF_ROTATION_90;
-                        break;
-                        }
-                    case WFC_ROTATION_180:
-                        {
-                        rotation = OWF_ROTATION_180;
-                        break;
-                        }
-                    case WFC_ROTATION_270:
-                        {
-                        rotation = OWF_ROTATION_270;
-                        break;
-                        }
-                    default:
-                        {
-                        OWF_ASSERT(0);
-                        rotation = OWF_ROTATION_0;
-                        }
-                    }
-                }
-    
-            if (!OWF_Screen_Post_Topmost_Layer(context->displayContext, stream, rotation))
-                {
+             /* this element is somehow degraded, its source is missing or
+              * something else; skip to next element */
+            DPRINT(("  *** Skipping element %d", element->handle));
+            continue;
+        }
+
+        DPRINT(("  Composing element %d", element->handle));
+
+        /* BeginComposition may fail e.g. if the element's destination
+         * rectangle is something bizarre, i.e. causes overflows or
+         * something.
+         */
+        if ((elementState=WFC_Pipeline_BeginComposition(context, element))!=NULL)
+        {
+            owfSymElementNotifications(context, element);
             
-                DPRINT(("WFC_Context_Compose calls OWF_DisplayContext_DisableFastpath because !OWF_Screen_Post_Topmost_Layer()"));
-                OWF_DisplayContext_DisableFastpath(context->displayContext);
-                //If fastpath is disabled here then we need to compose properly this cycle
-                }
-            }
-        targetStreamAccessed = OWF_DisplayContext_InternalStreamAccessed(context->displayContext);
-        if (OWF_DisplayContext_FastpathEnabled(context->displayContext) && ( targetStreamAccessed || !WFC_Context_Active(context) ))
-            {   //Fastpath in non-autonomous composition just does a simple copy and post.
-            DPRINT(("== WFC_Context_DoCompose(context = %p) -   fastpath copy target", context));
-            if (WFC_Context_LockTargetForWriting(context))
-                {
-                OWFboolean copy;
-                if (screenRotation)
-                    {
-                    if (WFC_ROTATION_90 == context->rotation || WFC_ROTATION_270 == context->rotation)
-                        {
-                        owfSetStreamFlipState(context->stream, OWF_TRUE);
-                        }
-                    else
-                        {
-                        owfSetStreamFlipState(context->stream, OWF_FALSE);
-                        }
-                    }
-                copy=OWF_DisplayContext_CopyFastpathedStreamToTargetStream(context);
-                if (!WFC_Context_Active(context))
-                    {
-                    if (!copy)
-                        {
-                        DPRINT(("WFC_Context_Compose calls OWF_DisplayContext_DisableFastpath because !OWF_DisplayContext_CopyFastpathedStreamToTargetStream()"));
-                        OWF_DisplayContext_DisableFastpath(context->displayContext);
-                        //If fastpath is disabled here then we need to compose properly this cycle
-                        }
-                    }
-                else
-                    {
-                    copy=OWF_FALSE;
-                    }
-              
-                WFC_Context_UnlockTarget(context,copy);
-                }
-            else
-                {
-                //If non-autonomous, then the lock target is required.
-                OWF_ASSERT(WFC_Context_Active(context));
-                }
+            WFC_Pipeline_ExecuteSourceConversionStage(context, elementState);
+            WFC_Pipeline_ExecuteCropStage(context, elementState);
+            WFC_Pipeline_ExecuteFlipStage(context, elementState);
+            WFC_Pipeline_ExecuteRotationStage(context, elementState);
+            WFC_Pipeline_ExecuteScalingStage(context, elementState);
+            WFC_Pipeline_ExecuteBlendingStage(context, elementState);
+                
+            WFC_Pipeline_EndComposition(context, element,elementState);
+        }
+    }
 
-            }
-        if (OWF_DisplayContext_FastpathEnabled(context->displayContext))
-            {
-            WFC_ELEMENT* topmostElement = NULL;
-            topmostElement = WFC_Scene_TopMostElement(context->committedScene);
-            owfSymElementNotifications(context, topmostElement);
-            }
-        }
-    if (!OWF_DisplayContext_FastpathEnabled(context->displayContext))
-        {
-        DPRINT(("== WFC_Context_DoCompose(context = %p) -   Composing", context));
-        WFC_Context_PrepareComposition(context);
-
-        scene = context->committedScene;
-        OWF_ASSERT(scene);
-    
-        for (node = scene->elements; NULL != node; node = node->next)
-            {
-            
-            WFC_ELEMENT*            element = NULL;
-            WFC_ELEMENT_STATE*      elementState = NULL;
-            element = ELEMENT(node->data);
+    WFC_Context_FinishComposition(context);
     
-            if (element->skipCompose)
-                {
-                 /* this element is somehow degraded, its source is missing or
-                  * something else; skip to next element */
-                DPRINT(("  *** Skipping element %d", element->handle));
-                continue;
-                }
-    
-            DPRINT(("  Composing element %d", element->handle));
-    
-            /* BeginComposition may fail e.g. if the element's destination
-             * rectangle is something bizarre, i.e. causes overflows or
-             * something.
-             */
-            if ((elementState=WFC_Pipeline_BeginComposition(context, element))!=NULL)
-                {
-                owfSymElementNotifications(context, element);
-                
-                WFC_Pipeline_ExecuteSourceConversionStage(context, elementState);
-                WFC_Pipeline_ExecuteCropStage(context, elementState);
-                WFC_Pipeline_ExecuteFlipStage(context, elementState);
-                WFC_Pipeline_ExecuteRotationStage(context, elementState);
-                WFC_Pipeline_ExecuteScalingStage(context, elementState);
-                WFC_Pipeline_ExecuteBlendingStage(context, elementState);
-                    
-                WFC_Pipeline_EndComposition(context, element,elementState);
-                }
-            }
-    
-        WFC_Context_FinishComposition(context);
-        DPRINT(("=== WFC_Context_DoCompose(context = %p) - Diplayed Composition", context));
-        }
-    
-    WFC_Scene_UnlockSourcesAndMasks(context->committedScene);
     owfSymProcessAllNotifications(context);
     OWF_Mutex_Unlock(&context->sceneMutex);
     
@@ -1497,6 +1205,7 @@
 WFC_Context_RemoveElement(WFC_CONTEXT* context,
                           WFCElement element)
 {
+    WFCErrorCode            err = WFC_ERROR_BAD_HANDLE;
     WFC_ELEMENT*            elemento = NULL;
 
     OWF_ASSERT(context);
@@ -1511,9 +1220,11 @@
          */
         elemento->shared = WFC_FALSE;
         context->lowestElement = WFC_Scene_LowestElement(context->workScene);
+
+        err = WFC_ERROR_NONE;
     }
 
-    return WFC_ERROR_NONE;
+    return err;
 }
 
 /*!
@@ -1681,10 +1392,6 @@
             {
                result = WFC_ERROR_ILLEGAL_ARGUMENT;
             }
-            else
-            {
-                OWF_DisplayContext_ResetFastpathCheck(context->displayContext);
-            }
             break;
         }
 
@@ -1878,7 +1585,6 @@
 WFC_Context_ComposerThread(void* data)
 {
     WFC_CONTEXT*            context = (WFC_CONTEXT*) data;
-    OWFboolean screenCreated = OWF_TRUE;
     OWF_MESSAGE             msg;
 
 
@@ -1886,17 +1592,8 @@
     DPRINT(("WFC_Context_ComposerThread starting"));
 
     memset(&msg, 0, sizeof(OWF_MESSAGE));
-    
-    if (context->type == WFC_CONTEXT_TYPE_ON_SCREEN)
-        {
-        screenCreated = OWF_Screen_Create(context->screenNumber, context->displayContext);
-        }
-    
-    OWF_ComposerThread_Rendezvous(context->displayContext);
 
-    OWF_ComposerThread_RendezvousDestroy(context->displayContext);
-    
-    while (context->device && msg.id != WFC_MESSAGE_QUIT && screenCreated)
+    while (context->device && msg.id != WFC_MESSAGE_QUIT)
     {
         OWFint              err = -1;
 
@@ -1934,11 +1631,6 @@
                                                           context,
                                                           WFC_FALSE);
                     context->activationState = WFC_CONTEXT_STATE_PASSIVE;
-                    if (OWF_DisplayContext_FastpathEnabled(context->displayContext))
-                        {
-                        DPRINT(("COMMIT: Invoking fastpath recomposition after deactivate"));
-                        WFC_Context_DoCompose(context);
-                        }
                     break;
                 }
 
@@ -1948,7 +1640,7 @@
 
                     DPRINT(("COMMIT: Invoking DoCommit"));
                     WFC_Context_DoCommit(context);
-                    OWF_DisplayContext_ResetFastpathCheck(context->displayContext);
+
                     if (!WFC_Context_Active(context))
                     {
                         DPRINT(("COMMIT: Context is inactive, composition "
@@ -1996,10 +1688,6 @@
         }
     }
 
-    if (context->type == WFC_CONTEXT_TYPE_ON_SCREEN)
-        {
-        OWF_Screen_Destroy(context->displayContext);
-        }
     /* Release any use of EGL by this thread. */
     eglReleaseThread();
 
@@ -2011,6 +1699,55 @@
 /*---------------------------------------------------------------------------
  *
  *----------------------------------------------------------------------------*/
+
+OWF_API_CALL void
+WFC_Context_SourceStreamUpdated(OWFNativeStreamType stream,
+                                OWFint event,
+                                void* data,
+                                void* returnParam)
+{
+    (void)returnParam;
+    OWF_ASSERT(data);
+
+    DPRINT(("WFC_Context_SourceStreamUpdated(%p, %x, %p)",
+            stream, event, data));
+    stream = stream; /* suppress compiler warning */
+ 
+    switch (event)
+    {
+        case OWF_OBSERVER_RETURN_DEFAULT_EVENT:
+        if (returnParam)
+        {
+            OWF_DEFAULT_EVENT_PARAM* parameter = (OWF_DEFAULT_EVENT_PARAM*) returnParam;
+            if ((parameter->length) == sizeof(OWF_DEFAULT_EVENT_PARAM))
+                {
+                parameter->event = OWF_STREAM_UPDATED;
+                }
+        }
+        break;
+    
+        case OWF_STREAM_UPDATED:
+            {
+                WFC_CONTEXT*            context = NULL;
+                context = CONTEXT(data);
+                OWF_ASSERT(context);
+                OWF_Mutex_Lock(&context->updateFlagMutex);
+                
+                if (WFC_Context_Active(context))
+                {
+                    ++context->sourceUpdateCount;
+                }
+                OWF_Mutex_Unlock(&context->updateFlagMutex);
+            }
+            break;
+        default:
+            break;
+    }
+}
+
+/*---------------------------------------------------------------------------
+ *
+ *----------------------------------------------------------------------------*/
 OWF_API_CALL WFCboolean
 WFC_Context_Active(WFC_CONTEXT* context)
 {