diff options
author | Alon Levy <alevy@redhat.com> | 2012-07-22 18:12:46 +0300 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2012-10-23 18:46:58 +0200 |
commit | bdfe2f2c4dbfd1e39bf6418e18ce52a953b1accc (patch) | |
tree | 49b3e83a21e1b9862eea7bb3956bdc639d696acc | |
parent | 9dfa77c2a4a3b06b54a1f3f39bcd16cd2db2c665 (diff) |
qxl: add cb destroy_primary_surface
-rw-r--r-- | src/qxl.h | 2 | ||||
-rw-r--r-- | src/qxl_driver.c | 46 |
2 files changed, 41 insertions, 7 deletions
@@ -241,6 +241,7 @@ struct _qxl_screen_t void (*reset_and_create_mem_slots)(qxl_screen_t *qxl); uint8_t *(*create_primary_surface)(qxl_screen_t *qxl, QXLMode *mode); + void (*destroy_primary_surface)(qxl_screen_t *qxl); #ifdef XSPICE /* XSpice specific */ @@ -489,7 +490,6 @@ static inline void qxl_mem_unverifiable(struct qxl_mem *mem) {} * I/O port commands */ void qxl_update_area(qxl_screen_t *qxl); -void qxl_io_destroy_primary(qxl_screen_t *qxl); void qxl_io_notify_oom(qxl_screen_t *qxl); void qxl_io_flush_surfaces(qxl_screen_t *qxl); void qxl_io_destroy_all_surfaces (qxl_screen_t *qxl); diff --git a/src/qxl_driver.c b/src/qxl_driver.c index 61c61a5..3426077 100644 --- a/src/qxl_driver.c +++ b/src/qxl_driver.c @@ -223,6 +223,22 @@ qxl_io_create_primary (qxl_screen_t *qxl) #endif } +#ifndef XSPICE +static void qxl_kms_decref_resource(qxl_screen_t *qxl, + uint32_t handle) +{ + struct drm_qxl_decref decref; + int ret; + + decref.handle = handle; + ret = drmIoctl(qxl->drm_fd, DRM_IOCTL_QXL_DECREF, &decref); + if (ret) { + xf86DrvMsg(qxl->pScrn->scrnIndex, X_ERROR, + "error doing QXL_DECREF\n"); + } +} +#endif + static uint32_t qxl_kms_alloc_resource(qxl_screen_t *qxl, uint32_t size, uint32_t type) { @@ -305,7 +321,7 @@ qxl_ums_create_primary_surface(qxl_screen_t *qxl, QXLMode *mode) return (uint8_t *)qxl->ram + mode->stride * (mode->y_res - 1); } -void qxl_io_destroy_primary(qxl_screen_t *qxl) +static void qxl_io_destroy_primary(qxl_screen_t *qxl) { #ifndef XSPICE if (qxl->pci->revision >= 3) @@ -320,8 +336,24 @@ void qxl_io_destroy_primary(qxl_screen_t *qxl) #else ioport_write (qxl, QXL_IO_DESTROY_PRIMARY, 0); #endif +} + +static void qxl_ums_destroy_primary_surface(qxl_screen_t *qxl) +{ + qxl_io_destroy_primary(qxl); qxl->device_primary = QXL_DEVICE_PRIMARY_NONE; + qxl->primary_handle = 0; +} + +#ifndef XSPICE +static void qxl_kms_destroy_primary_surface(qxl_screen_t *qxl) +{ + assert(qxl->primary_handle); + qxl_kms_decref_resource(qxl, qxl->primary_handle); + qxl->device_primary = QXL_DEVICE_PRIMARY_NONE; + qxl->primary_handle = 0; } +#endif void qxl_io_notify_oom (qxl_screen_t *qxl) @@ -1050,14 +1082,14 @@ qxl_resize_primary_to_virtual (qxl_screen_t *qxl) return FALSE; } } - + if (qxl->primary) { - qxl_surface_kill (qxl->primary); - qxl_surface_cache_sanity_check (qxl->surface_cache); - qxl_io_destroy_primary (qxl); + qxl_surface_kill (qxl->primary); + qxl_surface_cache_sanity_check (qxl->surface_cache); + qxl->destroy_primary_surface (qxl); } - + { struct QXLMode *pm = &qxl->primary_mode; pm->id = 0x4242; @@ -2473,6 +2505,7 @@ set_callbacks_to_ums(qxl_screen_t *qxl) { qxl->reset_and_create_mem_slots = qxl_ums_reset_and_create_mem_slots; qxl->create_primary_surface = qxl_ums_create_primary_surface; + qxl->destroy_primary_surface = qxl_ums_destroy_primary_surface; } #ifndef XSPICE @@ -2481,6 +2514,7 @@ set_callbacks_to_kms(qxl_screen_t *qxl) { qxl->reset_and_create_mem_slots = qxl_kms_reset_and_create_mem_slots; qxl->create_primary_surface = qxl_kms_create_primary_surface; + qxl->destroy_primary_surface = qxl_kms_destroy_primary_surface; } #endif |