diff options
| author | Søren Sandmann <ssp@redhat.com> | 2010-10-15 07:39:53 -0400 |
|---|---|---|
| committer | Søren Sandmann <ssp@redhat.com> | 2010-10-15 07:39:53 -0400 |
| commit | ca1952298adf026c1ff18448bafd4570bb880842 (patch) | |
| tree | adda51b4b2d26b39a5acd384bb6cabee40a37fec | |
| parent | 4eb4ae084d9a6cfe31926b7dba74baa219363f90 (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.h | 1 | ||||
| -rw-r--r-- | src/qxl_driver.c | 58 | ||||
| -rw-r--r-- | src/qxl_image.c | 1 | ||||
| -rw-r--r-- | src/qxl_surface.c | 16 | ||||
| -rw-r--r-- | src/uxa/uxa.c | 20 | ||||
| -rw-r--r-- | src/uxa/uxa.h | 1 |
6 files changed, 56 insertions, 41 deletions
@@ -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); |
