On 07/07/2011 12:43 PM, Alon Levy wrote:
---
display/driver.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/display/driver.c b/display/driver.c
index fff462d..e77e32f 100644
--- a/display/driver.c
+++ b/display/driver.c
@@ -958,13 +958,53 @@ VOID DrvDisableSurface(DHPDEV in_pdev)
DEBUG_PRINT((pdev, 1, "%s: 0x%lx exit\n", __FUNCTION__, pdev));
}
+static void FlushSurfaces(PDev *pdev)
+{
+ UINT32 surface_id;
+ SurfaceInfo *surface_info;
+ SURFOBJ *surf_obj;
+ RECTL area = {0, 0, 0, 0};
+
+ if (pdev->pci_revision< QXL_REVISION_STABLE_V10) {
+ DEBUG_PRINT((pdev, 1, "%s: revision too old for
QXL_IO_FLUSH_SURFACES", __FUNCTION__));
+ for (surface_id = pdev->n_surfaces - 1 ; surface_id> 0 ;
--surface_id) {
+ surface_info = GetSurfaceInfo(pdev, surface_id);
+ if (!surface_info->draw_area.base_mem) {
+ continue;
+ }
+ surf_obj = surface_info->draw_area.surf_obj;
+ if (!surf_obj) {
+ continue;
+ }
+ area.right = surf_obj->sizlBitmap.cx;
+ area.bottom = surf_obj->sizlBitmap.cy;
+ UpdateArea(pdev,&area, surface_id);
+ }
+ } else {
+ WRITE_PORT_UCHAR(pdev->flush_surfaces_port, 0);
+ }
+}
+static void FlushRelease(PDev *pdev)
+{
+ if (pdev->pci_revision< QXL_REVISION_STABLE_V10) {
+ DEBUG_PRINT((pdev, 1, "%s: revision too old for QXL_IO_FLUSH_RELEASE",
__FUNCTION__));
+ // ooming a few times causes the server to flush
+ // all releasable resources
+ WRITE_PORT_UCHAR(pdev->notify_oom_port, 0);
+ WRITE_PORT_UCHAR(pdev->notify_oom_port, 0);
+ WRITE_PORT_UCHAR(pdev->notify_oom_port, 0);
Hi,
since OOM is asynchronic, you should wait to display_event (first
SPICE_RING_CONS_WAIT on the release ring and then waiting on
display_event). Also, only one OOM call sould be enough, since all the
resources were already released by the wroker, and one OOM makes it
flush the release ring.
Cheers,
Yonit.
_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel