summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2012-07-22 18:12:46 +0300
committerAlon Levy <alevy@redhat.com>2012-10-23 18:46:58 +0200
commitbdfe2f2c4dbfd1e39bf6418e18ce52a953b1accc (patch)
tree49b3e83a21e1b9862eea7bb3956bdc639d696acc
parent9dfa77c2a4a3b06b54a1f3f39bcd16cd2db2c665 (diff)
qxl: add cb destroy_primary_surface
-rw-r--r--src/qxl.h2
-rw-r--r--src/qxl_driver.c46
2 files changed, 41 insertions, 7 deletions
diff --git a/src/qxl.h b/src/qxl.h
index 94c565d..7ccbd4f 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -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