summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <ssp@redhat.com>2010-10-15 07:39:53 -0400
committerSøren Sandmann <ssp@redhat.com>2010-10-15 07:39:53 -0400
commitca1952298adf026c1ff18448bafd4570bb880842 (patch)
treeadda51b4b2d26b39a5acd384bb6cabee40a37fec
parent4eb4ae084d9a6cfe31926b7dba74baa219363f90 (diff)
Split uxa_glyphs_init() into uxa_init_resources().
uxa_glyphs_init() eventually allocates a pixmap which has to be done after damage setup since otherwise _dixInitPrivates(PIXMAP_PRIVATE) will assert().
-rw-r--r--src/qxl.h1
-rw-r--r--src/qxl_driver.c58
-rw-r--r--src/qxl_image.c1
-rw-r--r--src/qxl_surface.c16
-rw-r--r--src/uxa/uxa.c20
-rw-r--r--src/uxa/uxa.h1
6 files changed, 56 insertions, 41 deletions
diff --git a/src/qxl.h b/src/qxl.h
index a4ecce6..7fd245e 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -865,3 +865,4 @@ void qxl_free (struct qxl_mem *mem,
void qxl_mem_free_all (struct qxl_mem *mem);
void * qxl_allocnf (qxl_screen_t *qxl,
unsigned long size);
+int qxl_garbage_collect (qxl_screen_t *qxl);
diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index 599cf0a..7300f8e 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -44,8 +44,8 @@
#endif
#define CHECK_POINT()
-static int
-garbage_collect (qxl_screen_t *qxl)
+int
+qxl_garbage_collect (qxl_screen_t *qxl)
{
uint64_t id;
int i = 0;
@@ -99,10 +99,6 @@ garbage_collect (qxl_screen_t *qxl)
}
else if (is_surface && surface_cmd->type == QXL_SURFACE_CMD_DESTROY)
{
-#if 0
- ErrorF ("handling destroy command %p\n", surface_cmd);
-#endif
-
qxl_surface_recycle (surface_cmd->surface_id);
}
@@ -138,7 +134,7 @@ qxl_handle_oom (qxl_screen_t *qxl)
// qxl_usleep (10000);
- return garbage_collect (qxl);
+ return qxl_garbage_collect (qxl);
}
void *
@@ -169,18 +165,21 @@ qxl_allocnf (qxl_screen_t *qxl, unsigned long size)
#if 0
ErrorF ("eliminated memory (%d)\n", nth_oom++);
#endif
-
- if (qxl_handle_oom (qxl))
- {
- n_attempts = 0;
- }
- else if (++n_attempts == 1000)
+
+ if (!qxl_garbage_collect (qxl))
{
- ErrorF ("Out of memory allocating %ld bytes\n", size);
- qxl_mem_dump_stats (qxl->mem, "Out of mem - stats\n");
-
- fprintf (stderr, "Out of memory\n");
- exit (1);
+ if (qxl_handle_oom (qxl))
+ {
+ n_attempts = 0;
+ }
+ else if (++n_attempts == 1000)
+ {
+ ErrorF ("Out of memory allocating %ld bytes\n", size);
+ qxl_mem_dump_stats (qxl->mem, "Out of mem - stats\n");
+
+ fprintf (stderr, "Out of memory\n");
+ exit (1);
+ }
}
}
@@ -986,7 +985,7 @@ qxl_check_copy (PixmapPtr source, PixmapPtr dest,
if (!get_surface (source) || !get_surface (dest))
return FALSE;
-
+
return TRUE;
}
@@ -1138,8 +1137,6 @@ setup_uxa (qxl_screen_t *qxl, ScreenPtr screen)
return FALSE;
}
-
-
#if 0
uxa_set_fallback_debug(screen, FALSE);
#endif
@@ -1247,17 +1244,20 @@ qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
pScreen->SaveScreen = qxl_blank_screen;
- /* Note: this must be done before setup_uxa(), because it
- * calls DamageSetup() which registers a pixmap private.
- *
- * That will trigger an assert if _dixInitPrivates has
- * been called, which setup_uxa() eventually does.
- */
+ setup_uxa (qxl, pScreen);
+
+ DamageSetup(pScreen);
+
miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
if (!miCreateDefColormap(pScreen))
goto out;
-
- setup_uxa (qxl, pScreen);
+
+ /* Note: this must be done after DamageSetup() because it calls
+ * _dixInitPrivates. And if that has been called, DamageSetup()
+ * will assert.
+ */
+ if (!uxa_resources_init (pScreen))
+ return FALSE;
qxl->create_screen_resources = pScreen->CreateScreenResources;
pScreen->CreateScreenResources = qxl_create_screen_resources;
diff --git a/src/qxl_image.c b/src/qxl_image.c
index b9868a0..062f593 100644
--- a/src/qxl_image.c
+++ b/src/qxl_image.c
@@ -150,7 +150,6 @@ qxl_image_create (qxl_screen_t *qxl, const uint8_t *data,
struct qxl_image *image;
struct qxl_data_chunk *chunk;
int dest_stride = width * Bpp;
- image_info_t *info;
#if 0
ErrorF ("Must create new image of size %d %d\n", width, height);
diff --git a/src/qxl_surface.c b/src/qxl_surface.c
index c4f35f5..432f679 100644
--- a/src/qxl_surface.c
+++ b/src/qxl_surface.c
@@ -424,6 +424,9 @@ retry2:
{
ErrorF ("- %dth attempt\n", n_attempts);
+ if (qxl_garbage_collect (qxl))
+ goto retry2;
+
if (qxl_handle_oom (qxl) && ++n_attempts < 30000)
goto retry2;
@@ -574,9 +577,6 @@ download_box (qxl_surface_t *surface, int x1, int y1, int x2, int y2)
outb (surface->qxl->io_base + QXL_IO_UPDATE_AREA, 0);
- while (qxl_handle_oom (surface->qxl))
- ;
-
#if 0
after = *((uint32_t *)surface->address - 1);
#endif
@@ -884,6 +884,10 @@ qxl_surface_copy (qxl_surface_t *dest,
print_region (" copy src", &(dest->u.copy_src->access_region));
print_region (" copy dest", &(dest->access_region));
#endif
+
+#if 0
+ ErrorF ("copy from %d to %d\n", dest->u.copy_src->id, dest->id);
+#endif
qrect.top = dest_y1;
qrect.bottom = dest_y1 + height;
@@ -937,6 +941,12 @@ qxl_surface_copy (qxl_surface_t *dest,
drawable->surfaces_dest[0] = dest->u.copy_src->id;
drawable->surfaces_rects[0] = drawable->u.copy.src_area;
+
+#if 0
+ submit_fill (qxl, dest->id, &qrect, 0xffff00ff);
+
+ usleep (70000);
+#endif
assert (src_x1 >= 0);
assert (src_y1 >= 0);
diff --git a/src/uxa/uxa.c b/src/uxa/uxa.c
index da67b8d..141c497 100644
--- a/src/uxa/uxa.c
+++ b/src/uxa/uxa.c
@@ -54,11 +54,10 @@ DevPrivateKeyRec uxa_screen_index;
*/
PixmapPtr uxa_get_drawable_pixmap(DrawablePtr pDrawable)
{
- if (pDrawable->type == DRAWABLE_WINDOW)
- return pDrawable->pScreen->
- GetWindowPixmap((WindowPtr) pDrawable);
- else
- return (PixmapPtr) pDrawable;
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ return pDrawable->pScreen->GetWindowPixmap((WindowPtr) pDrawable);
+ else
+ return (PixmapPtr) pDrawable;
}
/**
@@ -573,9 +572,6 @@ Bool uxa_driver_init(ScreenPtr screen, uxa_driver_t * uxa_driver)
}
#endif
- if (!uxa_glyphs_init(screen))
- return FALSE;
-
LogMessage(X_INFO,
"UXA(%d): Driver registered support for the following"
" operations:\n", screen->myNum);
@@ -605,3 +601,11 @@ void uxa_driver_fini(ScreenPtr pScreen)
{
/*right now does nothing */
}
+
+Bool uxa_resources_init(ScreenPtr screen)
+{
+ if (!uxa_glyphs_init(screen))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/src/uxa/uxa.h b/src/uxa/uxa.h
index 90e9c58..379d384 100644
--- a/src/uxa/uxa.h
+++ b/src/uxa/uxa.h
@@ -558,6 +558,7 @@ typedef struct _UxaDriver {
uxa_driver_t *uxa_driver_alloc(void);
Bool uxa_driver_init(ScreenPtr screen, uxa_driver_t * uxa_driver);
+Bool uxa_resources_init(ScreenPtr screen);
void uxa_driver_fini(ScreenPtr pScreen);