summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2016-09-08 17:45:32 +0900
committerMichel Dänzer <michel@daenzer.net>2016-09-09 19:03:06 +0900
commit1c725f63961746258f6138b47037ec18bf508d78 (patch)
tree60ffc9579958f7a5cf8c7f5a4c0af0dc9075461a
parentc92842764f95fa09e145d81f80e9fa39ea8c453c (diff)
Factor out transform_region helper
(Ported from radeon commit 5a57005178fc13b6f7e513458ca6dae72a3e5783) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--src/amdgpu_kms.c74
1 files changed, 43 insertions, 31 deletions
diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 5e3d322..c75d429 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -304,6 +304,45 @@ static Bool AMDGPUCreateScreenResources_KMS(ScreenPtr pScreen)
}
#ifdef AMDGPU_PIXMAP_SHARING
+
+static RegionPtr
+transform_region(RegionPtr region, struct pict_f_transform *transform,
+ int w, int h)
+{
+ BoxPtr boxes = RegionRects(region);
+ int nboxes = RegionNumRects(region);
+ xRectanglePtr rects = malloc(nboxes * sizeof(*rects));
+ RegionPtr transformed;
+ int nrects = 0;
+ BoxRec box;
+ int i;
+
+ for (i = 0; i < nboxes; i++) {
+ box.x1 = boxes[i].x1;
+ box.x2 = boxes[i].x2;
+ box.y1 = boxes[i].y1;
+ box.y2 = boxes[i].y2;
+ pixman_f_transform_bounds(transform, &box);
+
+ box.x1 = max(box.x1, 0);
+ box.y1 = max(box.y1, 0);
+ box.x2 = min(box.x2, w);
+ box.y2 = min(box.y2, h);
+ if (box.x1 >= box.x2 || box.y1 >= box.y2)
+ continue;
+
+ rects[nrects].x = box.x1;
+ rects[nrects].y = box.y1;
+ rects[nrects].width = box.x2 - box.x1;
+ rects[nrects].height = box.y2 - box.y1;
+ nrects++;
+ }
+
+ transformed = RegionFromRects(nrects, rects, CT_UNSORTED);
+ free(rects);
+ return transformed;
+}
+
static RegionPtr
dirty_region(PixmapDirtyUpdatePtr dirty)
{
@@ -312,37 +351,10 @@ dirty_region(PixmapDirtyUpdatePtr dirty)
#ifdef HAS_DIRTYTRACKING_ROTATION
if (dirty->rotation != RR_Rotate_0) {
- BoxPtr boxes = RegionRects(damageregion);
- int nboxes = RegionNumRects(damageregion);
- xRectanglePtr rects = malloc(nboxes * sizeof(*rects));
- int dst_w = dirty->slave_dst->drawable.width;
- int dst_h = dirty->slave_dst->drawable.height;
- int nrects = 0;
- BoxRec box;
- int i;
-
- for (i = 0; i < nboxes; i++) {
- box.x1 = boxes[i].x1;
- box.x2 = boxes[i].x2;
- box.y1 = boxes[i].y1;
- box.y2 = boxes[i].y2;
- pixman_f_transform_bounds(&dirty->f_inverse, &box);
-
- box.x1 = max(box.x1, 0);
- box.y1 = max(box.y1, 0);
- box.x2 = min(box.x2, dst_w);
- box.y2 = min(box.y2, dst_h);
- if (box.x1 >= box.x2 || box.y1 >= box.y2)
- continue;
-
- rects[nrects].x = box.x1;
- rects[nrects].y = box.y1;
- rects[nrects].width = box.x2 - box.x1;
- rects[nrects].height = box.y2 - box.y1;
- nrects++;
- }
- dstregion = RegionFromRects(nrects, rects, CT_UNSORTED);
- free(rects);
+ dstregion = transform_region(damageregion,
+ &dirty->f_inverse,
+ dirty->slave_dst->drawable.width,
+ dirty->slave_dst->drawable.height);
} else
#endif
{