From patchwork Wed Aug 19 00:58:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hyungwon Hwang X-Patchwork-Id: 7034311 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 0060F9F4DC for ; Wed, 19 Aug 2015 00:59:00 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 089CB20569 for ; Wed, 19 Aug 2015 00:58:59 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 895DE2055D for ; Wed, 19 Aug 2015 00:58:56 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CF9D16E723; Tue, 18 Aug 2015 17:58:53 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by gabe.freedesktop.org (Postfix) with ESMTPS id 39B106E723 for ; Tue, 18 Aug 2015 17:58:53 -0700 (PDT) Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NTB02K571E3WU40@mailout3.samsung.com> for dri-devel@lists.freedesktop.org; Wed, 19 Aug 2015 09:58:51 +0900 (KST) Received: from epcpsbgm2new.samsung.com ( [172.20.52.113]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 42.BD.17770.AC4D3D55; Wed, 19 Aug 2015 09:58:51 +0900 (KST) X-AuditID: cbfee691-f79ca6d00000456a-78-55d3d4cafeaa Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2new.samsung.com (EPCPMTA) with SMTP id AD.14.07062.AC4D3D55; Wed, 19 Aug 2015 09:58:50 +0900 (KST) Received: from localhost.localdomain.localdomain ([10.252.82.145]) by mmp1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NTB0003C1DZWBK0@mmp1.samsung.com>; Wed, 19 Aug 2015 09:58:50 +0900 (KST) From: Hyungwon Hwang To: dri-devel@lists.freedesktop.org, human.hwang@samsung.com Subject: [PATCH 2/6] xf86drmMode: separate drmModeAtomicCommit() and drmModeAtomicCleanup() Date: Wed, 19 Aug 2015 09:58:40 +0900 Message-id: <1439945924-22630-2-git-send-email-human.hwang@samsung.com> X-Mailer: git-send-email 2.4.3 In-reply-to: <1439945924-22630-1-git-send-email-human.hwang@samsung.com> References: <1439945924-22630-1-git-send-email-human.hwang@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGLMWRmVeSWpSXmKPExsWyRsSkUPf0lcuhBvPfMFpc+fqezWLpjD5W ByaP+93HmTz6tqxiDGCK4rJJSc3JLEst0rdL4Mo4POUUe8FS1Yp1f7pZGhj/yHYxcnBICJhI 3Dhc2sXICWSKSVy4t56ti5GLQ0hgBaPEz8dPWCASJhKzJu5ghEgsZZSYfXMWE4TTxiRxc/lj VpAqNgE9iQXXfrCDTBURsJGYczEDJCwsECuxdt0DsEEsAqoSk5Z1gZXwCrhLfJ7ACDFfTuLc +i9gJZwCHhIrtj9mA7GFgEp2/jsJtkpC4DqbRN+lZiaIOQIS3yYfYoF4QFZi0wFmiDmSEgdX 3GCZwCi0gJFhFaNoakFyQXFSepGpXnFibnFpXrpecn7uJkZg8J3+9wzoofsHrA8xCnAwKvHw zth2OVSINbGsuDL3EKMp0IaJzFKiyfnAEM8riTc0NjOyMDUxNTYytzRTEufVkf4ZLCSQnliS mp2aWpBaFF9UmpNafIiRiYNTqoGRR8ha4qLXR4f+wGDxf/I2EbOO+2seY7gsNEFxt6F/1QTn nD83lCT41i77vcr3a0uOT0xx2Rf/e55Vgq2TfphPF8hUu8Ib9fyz3HQOz3alZuEr/LE3+9w+ Z27n3T3xTsTG8x/OHn4d2fp++6ZTZ+z/e5VaJnaGVB+ouLjB7Xu1S6euzEQ5Ky8lluKMREMt 5qLiRADR7SrgOQIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrCLMWRmVeSWpSXmKPExsVy+t9jAd1TVy6HGkxba2Vx5et7NoulM/pY HZg87ncfZ/Lo27KKMYApqoHRJiM1MSW1SCE1Lzk/JTMv3VbJOzjeOd7UzMBQ19DSwlxJIS8x N9VWycUnQNctMwdogZJCWWJOKVAoILG4WEnfDtOE0BA3XQuYxghd35AguB4jAzSQsIYx4/CU U+wFS1Ur1v3pZmlg/CPbxcjJISFgIjFr4g5GCFtM4sK99WxdjFwcQgJLGSVm35zFBOG0MUnc XP6YFaSKTUBPYsG1H+xdjBwcIgI2EnMuZoCEhQViJdaue8ACYrMIqEpMWtYFVsIr4C7xeQLU fDmJc+u/gJVwCnhIrNj+mA3EFgIq2fnvJNMERp4FjAyrGCVSC5ILipPSc43yUsv1ihNzi0vz 0vWS83M3MYJD/Jn0DsbDu9wPMQpwMCrx8M7YdjlUiDWxrLgy9xCjBAezkgjvz51AId6UxMqq 1KL8+KLSnNTiQ4ymQHdNZJYSTc4Hxl9eSbyhsYmZkaWRuaGFkbG5kjivvsmmUCGB9MSS1OzU 1ILUIpg+Jg5OqQZGJbGnJcJOIaue8s7MMdM5JO37adu3f1rvc222uBjzfhP0zHvI/0hzqVDo 4bIVzQkzrqo4HM8y3VG7fPsTzgf5mcwVFuVrPuQzXpzHfCnxgZSe4oaCVgt1i+idAZtPtfpr Pljba/3b7sOCue7NsSpKUb1J3+unCR5f5LduK1f+/Ge+a/I2RD5RYinOSDTUYi4qTgQA+Yed n4cCAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch seprates the code, which sorts proprty sets and eliminates duplicate properties, from drmModeAtomicCommit(). Now drmModeAtomicCleanup() has to do the job before calling drmModeAtomicCommit(), and drmModeAtomicCommit() just converts the cleaned request to IOCTL argument. Signed-off-by: Hyungwon Hwang --- xf86drmMode.c | 72 +++++++++++++++++++++++++++++++++-------------------------- xf86drmMode.h | 1 + 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/xf86drmMode.c b/xf86drmMode.c index d4ed5c1..82c4c91 100644 --- a/xf86drmMode.c +++ b/xf86drmMode.c @@ -1303,10 +1303,39 @@ static int sort_req_list(const void *misc, const void *other) return second->property_id - first->property_id; } +void drmModeAtomicCleanup(drmModeAtomicReqPtr req) +{ + uint32_t last_obj_id = 0; + uint32_t i; + + if (req->cursor == 0) + return; + + /* Sort the list by object ID, then by property ID. */ + qsort(req->items, req->cursor, sizeof(*req->items), + sort_req_list); + + /* Eliminate duplicate property sets. */ + for (i = 0; i < req->cursor; i++) { + if (req->items[i].object_id != last_obj_id) + last_obj_id = req->items[i].object_id; + + if (i == req->cursor - 1) + continue; + + if (req->items[i].object_id != req->items[i + 1].object_id || + req->items[i].property_id != req->items[i + 1].property_id) + continue; + + memmove(&req->items[i], &req->items[i + 1], + (req->cursor - i - 1) * sizeof(*req->items)); + req->cursor--; + } +} + int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req, uint32_t flags, void *user_data) { - drmModeAtomicReqPtr sorted; struct drm_mode_atomic atomic; uint32_t *objs_ptr = NULL; uint32_t *count_props_ptr = NULL; @@ -1320,33 +1349,13 @@ int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req, uint32_t flags, if (req->cursor == 0) return 0; - sorted = drmModeAtomicDuplicate(req); - if (sorted == NULL) - return -ENOMEM; - memclear(atomic); - /* Sort the list by object ID, then by property ID. */ - qsort(sorted->items, sorted->cursor, sizeof(*sorted->items), - sort_req_list); - - /* Now the list is sorted, eliminate duplicate property sets. */ - for (i = 0; i < sorted->cursor; i++) { - if (sorted->items[i].object_id != last_obj_id) { + for (i = 0; i < req->cursor; i++) { + if (req->items[i].object_id != last_obj_id) { atomic.count_objs++; - last_obj_id = sorted->items[i].object_id; + last_obj_id = req->items[i].object_id; } - - if (i == sorted->cursor - 1) - continue; - - if (sorted->items[i].object_id != sorted->items[i + 1].object_id || - sorted->items[i].property_id != sorted->items[i + 1].property_id) - continue; - - memmove(&sorted->items[i], &sorted->items[i + 1], - (sorted->cursor - i - 1) * sizeof(*sorted->items)); - sorted->cursor--; } objs_ptr = drmMalloc(atomic.count_objs * sizeof objs_ptr[0]); @@ -1361,28 +1370,28 @@ int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req, uint32_t flags, goto out; } - props_ptr = drmMalloc(sorted->cursor * sizeof props_ptr[0]); + props_ptr = drmMalloc(req->cursor * sizeof props_ptr[0]); if (!props_ptr) { errno = ENOMEM; goto out; } - prop_values_ptr = drmMalloc(sorted->cursor * sizeof prop_values_ptr[0]); + prop_values_ptr = drmMalloc(req->cursor * sizeof prop_values_ptr[0]); if (!prop_values_ptr) { errno = ENOMEM; goto out; } - for (i = 0, last_obj_id = 0; i < sorted->cursor; i++) { - if (sorted->items[i].object_id != last_obj_id) { + for (i = 0, last_obj_id = 0; i < req->cursor; i++) { + if (req->items[i].object_id != last_obj_id) { obj_idx++; - objs_ptr[obj_idx] = sorted->items[i].object_id; + objs_ptr[obj_idx] = req->items[i].object_id; last_obj_id = objs_ptr[obj_idx]; } count_props_ptr[obj_idx]++; - props_ptr[i] = sorted->items[i].property_id; - prop_values_ptr[i] = sorted->items[i].value; + props_ptr[i] = req->items[i].property_id; + prop_values_ptr[i] = req->items[i].value; } @@ -1400,7 +1409,6 @@ out: drmFree(count_props_ptr); drmFree(props_ptr); drmFree(prop_values_ptr); - drmModeAtomicFree(sorted); return ret; } diff --git a/xf86drmMode.h b/xf86drmMode.h index 4de7bbb..fe14078 100644 --- a/xf86drmMode.h +++ b/xf86drmMode.h @@ -498,6 +498,7 @@ extern int drmModeAtomicAddProperty(drmModeAtomicReqPtr req, uint32_t object_id, uint32_t property_id, uint64_t value); +extern void drmModeAtomicCleanup(drmModeAtomicReqPtr req); extern int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req, uint32_t flags,