g3dvl: Implement surface sync functions.
authorYounes Manton <younes.m@gmail.com>
Wed, 10 Sep 2008 23:37:56 +0000 (19:37 -0400)
committerYounes Manton <younes.m@gmail.com>
Fri, 12 Sep 2008 18:31:07 +0000 (14:31 -0400)
src/gallium/state_trackers/g3dvl/vl_r16snorm_mc_buf.c
src/gallium/state_trackers/g3dvl/vl_surface.c
src/gallium/state_trackers/g3dvl/vl_surface.h
src/gallium/state_trackers/g3dvl/vl_types.h
src/libXvMC/surface.c

index cfbad08..75d326b 100644 (file)
@@ -591,6 +591,10 @@ static int vlFlush
        assert(render);
 
        mc = (struct vlR16SnormBufferedMC*)render;
+
+       if (!mc->buffered_surface)
+               return 0;
+
        pipe = mc->pipe;
 
        for (i = 0; i < mc->num_macroblocks; ++i)
@@ -736,8 +740,12 @@ static int vlFlush
                vb_start += num_macroblocks[vlMacroBlockExTypeBiPredictedField] * 24;
        }
 
+       pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, &mc->buffered_surface->render_fence);
+
        for (i = 0; i < 3; ++i)
                mc->zero_block[i].x = -1.0f;
+
+       mc->buffered_surface = NULL;
        mc->num_macroblocks = 0;
        mc->cur_buf++;
 
@@ -760,12 +768,7 @@ static int vlRenderMacroBlocksMpeg2R16SnormBuffered
 
        if (mc->buffered_surface)
        {
-               if
-               (
-                       mc->buffered_surface != surface /*||
-                       mc->past_surface != batch->past_surface ||
-                       mc->future_surface != batch->future_surface*/
-               )
+               if (mc->buffered_surface != surface)
                {
                        vlFlush(&mc->base);
                        mc->buffered_surface = surface;
@@ -1027,7 +1030,6 @@ static int vlCreateFragmentShaderIMB
                inst.FullSrcRegisters[0].SrcRegister.SwizzleZ = TGSI_SWIZZLE_X;
                inst.FullDstRegisters[0].DstRegister.WriteMask = TGSI_WRITEMASK_X << i;
                ti += tgsi_build_full_instruction(&inst, &tokens[ti], header, max_tokens - ti);
-
        }
 
        /* mul o0, t0, c0               ; Rescale texel to correct range */
@@ -1323,7 +1325,6 @@ static int vlCreateFragmentShaderFramePMB
                inst.FullSrcRegisters[0].SrcRegister.SwizzleZ = TGSI_SWIZZLE_X;
                inst.FullDstRegisters[0].DstRegister.WriteMask = TGSI_WRITEMASK_X << i;
                ti += tgsi_build_full_instruction(&inst, &tokens[ti], header, max_tokens - ti);
-
        }
 
        /* mul t0, t0, c0               ; Rescale texel to correct range */
@@ -1442,7 +1443,6 @@ static int vlCreateFragmentShaderFieldPMB
                inst.FullSrcRegisters[0].SrcRegister.SwizzleZ = TGSI_SWIZZLE_X;
                inst.FullDstRegisters[0].DstRegister.WriteMask = TGSI_WRITEMASK_X << i;
                ti += tgsi_build_full_instruction(&inst, &tokens[ti], header, max_tokens - ti);
-
        }
 
        /* mul t0, t0, c0               ; Rescale texel to correct range */
@@ -1818,7 +1818,6 @@ static int vlCreateFragmentShaderFrameBMB
                inst.FullSrcRegisters[0].SrcRegister.SwizzleZ = TGSI_SWIZZLE_X;
                inst.FullDstRegisters[0].DstRegister.WriteMask = TGSI_WRITEMASK_X << i;
                ti += tgsi_build_full_instruction(&inst, &tokens[ti], header, max_tokens - ti);
-
        }
 
        /* mul t0, t0, c0               ; Rescale texel to correct range */
@@ -1955,7 +1954,6 @@ static int vlCreateFragmentShaderFieldBMB
                inst.FullSrcRegisters[0].SrcRegister.SwizzleZ = TGSI_SWIZZLE_X;
                inst.FullDstRegisters[0].DstRegister.WriteMask = TGSI_WRITEMASK_X << i;
                ti += tgsi_build_full_instruction(&inst, &tokens[ti], header, max_tokens - ti);
-
        }
 
        /* mul t0, t0, c0               ; Rescale texel to correct range */
index 07a9be2..6648133 100644 (file)
@@ -77,6 +77,7 @@ int vlRenderMacroBlocksMpeg2
 {
        assert(batch);
        assert(surface);
+       assert(surface->context);
 
        surface->context->render->vlBegin(surface->context->render);
 
@@ -141,9 +142,10 @@ int vlPutPicture
 
        csc->vlEnd(csc);
 
-       pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
+       pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, &surface->disp_fence);
+
        bind_pipe_drawable(pipe, drawable);
-       /* TODO: Need to take destx, desty into consideration */
+
        pipe->winsys->flush_frontbuffer
        (
                pipe->winsys,
@@ -154,6 +156,59 @@ int vlPutPicture
        return 0;
 }
 
+int vlSurfaceGetStatus
+(
+       struct vlSurface *surface,
+       enum vlResourceStatus *status
+)
+{
+       assert(surface);
+       assert(surface->context);
+       assert(status);
+
+       if (surface->render_fence && !surface->context->pipe->winsys->fence_signalled(surface->context->pipe->winsys, surface->render_fence, 0))
+       {
+               *status = vlResourceStatusRendering;
+               return 0;
+       }
+
+       if (surface->disp_fence && !surface->context->pipe->winsys->fence_signalled(surface->context->pipe->winsys, surface->disp_fence, 0))
+       {
+               *status = vlResourceStatusDisplaying;
+               return 0;
+       }
+
+       *status = vlResourceStatusFree;
+       return 0;
+}
+
+int vlSurfaceFlush
+(
+       struct vlSurface *surface
+)
+{
+       assert(surface);
+       assert(surface->context);
+
+       surface->context->render->vlFlush(surface->context->render);
+
+       return 0;
+}
+
+int vlSurfaceSync
+(
+       struct vlSurface *surface
+)
+{
+       assert(surface);
+       assert(surface->context);
+       assert(surface->render_fence);
+
+       surface->context->pipe->winsys->fence_finish(surface->context->pipe->winsys, surface->render_fence, 0);
+
+       return 0;
+}
+
 struct vlScreen* vlSurfaceGetScreen
 (
        struct vlSurface *surface
index 3e05050..133e151 100644 (file)
@@ -8,12 +8,14 @@ struct pipe_texture;
 
 struct vlSurface
 {
-       struct vlScreen         *screen;
-       struct vlContext        *context;
-       unsigned int            width;
-       unsigned int            height;
-       enum vlFormat           format;
-       struct pipe_texture     *texture;
+       struct vlScreen                 *screen;
+       struct vlContext                *context;
+       unsigned int                    width;
+       unsigned int                    height;
+       enum vlFormat                   format;
+       struct pipe_texture             *texture;
+       struct pipe_fence_handle        *render_fence;
+       struct pipe_fence_handle        *disp_fence;
 };
 #endif
 
@@ -54,6 +56,22 @@ int vlPutPicture
        enum vlPictureType picture_type
 );
 
+int vlSurfaceGetStatus
+(
+       struct vlSurface *surface,
+       enum vlResourceStatus *status
+);
+
+int vlSurfaceFlush
+(
+       struct vlSurface *surface
+);
+
+int vlSurfaceSync
+(
+       struct vlSurface *surface
+);
+
 struct vlScreen* vlSurfaceGetScreen
 (
        struct vlSurface *surface
index b432bfd..274e1f7 100644 (file)
@@ -13,6 +13,13 @@ struct vlScreen;
 struct vlContext;
 struct vlSurface;
 
+enum vlResourceStatus
+{
+       vlResourceStatusFree,
+       vlResourceStatusRendering,
+       vlResourceStatusDisplaying
+};
+
 enum vlProfile
 {
        vlProfileMpeg2Simple,
index b8459c0..a920da5 100644 (file)
@@ -201,7 +201,7 @@ Status XvMCFlushSurface(Display *display, XvMCSurface *surface)
 
        assert(display == vlGetNativeDisplay(vlGetDisplay(vlSurfaceGetScreen(vl_sfc))));
 
-       /* TODO */
+       vlSurfaceFlush(vl_sfc);
 
        return Success;
 }
@@ -219,7 +219,7 @@ Status XvMCSyncSurface(Display *display, XvMCSurface *surface)
 
        assert(display == vlGetNativeDisplay(vlGetDisplay(vlSurfaceGetScreen(vl_sfc))));
 
-       /* TODO */
+       vlSurfaceSync(vl_sfc);
 
        return Success;
 }
@@ -273,7 +273,8 @@ Status XvMCPutSurface
 
 Status XvMCGetSurfaceStatus(Display *display, XvMCSurface *surface, int *status)
 {
-       struct vlSurface *vl_sfc;
+       struct vlSurface        *vl_sfc;
+       enum vlResourceStatus   res_status;
 
        assert(display);
 
@@ -286,8 +287,28 @@ Status XvMCGetSurfaceStatus(Display *display, XvMCSurface *surface, int *status)
 
        assert(display == vlGetNativeDisplay(vlGetDisplay(vlSurfaceGetScreen(vl_sfc))));
 
-       /* TODO */
-       *status = 0;
+       vlSurfaceGetStatus(vl_sfc, &res_status);
+
+       switch (res_status)
+       {
+               case vlResourceStatusFree:
+               {
+                       *status = 0;
+                       break;
+               }
+               case vlResourceStatusRendering:
+               {
+                       *status = XVMC_RENDERING;
+                       break;
+               }
+               case vlResourceStatusDisplaying:
+               {
+                       *status = XVMC_DISPLAYING;
+                       break;
+               }
+               default:
+                       assert(0);
+       }
 
        return Success;
 }