1bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae/*
2bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * Copyright (C) 2013 Samsung Electronics Co.Ltd
3bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * Authors:
4bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae *	Inki Dae <inki.dae@samsung.com>
5bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae *
6bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * This program is free software; you can redistribute  it and/or modify it
7bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * under  the terms of  the GNU General  Public License as published by the
8bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * Free Software Foundation;  either version 2 of the  License, or (at your
9bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * option) any later version.
10bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae *
11bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae */
12bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
13bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#ifdef HAVE_CONFIG_H
14bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include "config.h"
15bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#endif
16bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
17bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <stdlib.h>
18bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <stdio.h>
19bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <string.h>
20bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <errno.h>
21bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
22bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <sys/mman.h>
23bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <linux/stddef.h>
24bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
25bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <xf86drm.h>
26bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <xf86drmMode.h>
27bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <libkms.h>
28bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include <drm_fourcc.h>
29bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
30bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include "exynos_drm.h"
31bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include "exynos_drmif.h"
32bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#include "fimg2d.h"
33bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
34bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#define DRM_MODULE_NAME		"exynos"
35bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae#define MAX_TEST_CASE		8
36bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
37bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic unsigned int screen_width, screen_height;
38bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
39bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae/*
40bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * A structure to test fimg2d hw.
41bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae *
42bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * @solid_fild: fill given color data to source buffer.
43bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * @copy: copy source to destination buffer.
44bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * @copy_with_scale: copy source to destination buffer scaling up or
45bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae *	down properly.
46bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae * @blend: blend source to destination buffer.
47bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae */
48bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestruct fimg2d_test_case {
49bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int (*solid_fill)(struct exynos_device *dev, struct exynos_bo *dst);
50bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int (*copy)(struct exynos_device *dev, struct exynos_bo *src,
51bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			struct exynos_bo *dst, enum e_g2d_buf_type);
52bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int (*copy_with_scale)(struct exynos_device *dev,
53bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				struct exynos_bo *src, struct exynos_bo *dst,
54bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				enum e_g2d_buf_type);
55bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int (*blend)(struct exynos_device *dev,
56bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				struct exynos_bo *src, struct exynos_bo *dst,
57bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				enum e_g2d_buf_type);
58bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae};
59bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
60bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestruct connector {
61bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	uint32_t id;
62bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	char mode_str[64];
63bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	char format_str[5];
64bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int fourcc;
65bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmModeModeInfo *mode;
66bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmModeEncoder *encoder;
67bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int crtc;
68bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int pipe;
69bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int plane_zpos;
70bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int fb_id[2], current_fb_id;
71bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct timeval start;
72bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
73bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int swap_count;
74bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae};
75bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
76bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic void connector_find_mode(int fd, struct connector *c,
77bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				drmModeRes *resources)
78bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
79bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmModeConnector *connector;
80bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int i, j;
81bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
82bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	/* First, find the connector & mode */
83bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	c->mode = NULL;
84bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	for (i = 0; i < resources->count_connectors; i++) {
85bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		connector = drmModeGetConnector(fd, resources->connectors[i]);
86bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
87bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (!connector) {
88bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			fprintf(stderr, "could not get connector %i: %s\n",
89bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				resources->connectors[i], strerror(errno));
90bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			drmModeFreeConnector(connector);
91bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			continue;
92bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
93bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
94bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (!connector->count_modes) {
95bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			drmModeFreeConnector(connector);
96bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			continue;
97bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
98bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
99bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (connector->connector_id != c->id) {
100bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			drmModeFreeConnector(connector);
101bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			continue;
102bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
103bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
104bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		for (j = 0; j < connector->count_modes; j++) {
105bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			c->mode = &connector->modes[j];
106bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			if (!strcmp(c->mode->name, c->mode_str))
107bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				break;
108bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
109bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
110bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		/* Found it, break out */
111bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (c->mode)
112bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			break;
113bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
114bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		drmModeFreeConnector(connector);
115bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
116bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
117bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!c->mode) {
118bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "failed to find mode \"%s\"\n", c->mode_str);
119bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return;
120bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
121bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
122bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	/* Now get the encoder */
123bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	for (i = 0; i < resources->count_encoders; i++) {
124bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		c->encoder = drmModeGetEncoder(fd, resources->encoders[i]);
125bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
126bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (!c->encoder) {
127bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			fprintf(stderr, "could not get encoder %i: %s\n",
128bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				resources->encoders[i], strerror(errno));
129bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			drmModeFreeEncoder(c->encoder);
130bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			continue;
131bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
132bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
133bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (c->encoder->encoder_id  == connector->encoder_id)
134bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			break;
135bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
136bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		drmModeFreeEncoder(c->encoder);
137bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
138bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
139bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (c->crtc == -1)
140bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		c->crtc = c->encoder->crtc_id;
141bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
142bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
143bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic int connector_find_plane(int fd, unsigned int *plane_id)
144bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
145bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmModePlaneRes *plane_resources;
146bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmModePlane *ovr;
147bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int i;
148bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
149bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	plane_resources = drmModeGetPlaneResources(fd);
150bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!plane_resources) {
151bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "drmModeGetPlaneResources failed: %s\n",
152bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			strerror(errno));
153bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return -1;
154bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
155bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
156bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	for (i = 0; i < plane_resources->count_planes; i++) {
157bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		plane_id[i] = 0;
158bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
159bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		ovr = drmModeGetPlane(fd, plane_resources->planes[i]);
160bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (!ovr) {
161bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			fprintf(stderr, "drmModeGetPlane failed: %s\n",
162bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				strerror(errno));
163bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			continue;
164bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
165bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
166bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (ovr->possible_crtcs & (1 << 0))
167bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			plane_id[i] = ovr->plane_id;
168bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		drmModeFreePlane(ovr);
169bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
170bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
171bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return 0;
172bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
173bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
174bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic int drm_set_crtc(struct exynos_device *dev, struct connector *c,
175bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			unsigned int fb_id)
176bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
177bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int ret;
178bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
179bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = drmModeSetCrtc(dev->fd, c->crtc,
180bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			fb_id, 0, 0, &c->id, 1, c->mode);
181bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret) {
182bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		drmMsg("failed to set mode: %s\n", strerror(errno));
183bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err;
184bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
185bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
186bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return 0;
187bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
188bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr:
189bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return ret;
190bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
191bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
192bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic struct exynos_bo *exynos_create_buffer(struct exynos_device *dev,
193bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae						unsigned long size,
194bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae						unsigned int flags)
195bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
196bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct exynos_bo *bo;
197bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
198bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	bo = exynos_bo_create(dev, size, flags);
199bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!bo)
200bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return bo;
201bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
202bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!exynos_bo_map(bo)) {
203bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		exynos_bo_destroy(bo);
204bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return NULL;
205bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
206bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
207bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return bo;
208bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
209bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
210bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic void exynos_destroy_buffer(struct exynos_bo *bo)
211bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
212bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	exynos_bo_destroy(bo);
213bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
214bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
215bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic int g2d_solid_fill_test(struct exynos_device *dev, struct exynos_bo *dst)
216bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
217bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_context *ctx;
218bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_image img;
219bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int count, img_w, img_h;
220bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int ret = 0;
221bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
222bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ctx = g2d_init(dev->fd);
223bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!ctx)
224bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return -EFAULT;
225bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
226bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&img, 0, sizeof(struct g2d_image));
227bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img.bo[0] = dst->handle;
228bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
229bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	printf("soild fill test.\n");
230bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
231bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	srand(time(NULL));
232bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_w = screen_width;
233bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_h = screen_height;
234bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
235bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	for (count = 0; count < 2; count++) {
236bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		unsigned int x, y, w, h;
237bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
238bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		x = rand() % (img_w / 2);
239bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		y = rand() % (img_h / 2);
240bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		w = rand() % (img_w - x);
241bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		h = rand() % (img_h - y);
242bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
243bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		img.width = img_w;
244bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		img.height = img_h;
245bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		img.stride = img.width * 4;
246bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
247bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		img.color = 0xff000000 + (random() & 0xffffff);
248bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
249bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		ret = g2d_solid_fill(ctx, &img, x, y, w, h);
250bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (ret < 0)
251bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			goto err_fini;
252bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
253bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		ret = g2d_exec(ctx);
254bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (ret < 0)
255bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			break;
256bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
257bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
258bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_fini:
259bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	g2d_fini(ctx);
260bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
261bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return ret;
262bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
263bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
264bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic int g2d_copy_test(struct exynos_device *dev, struct exynos_bo *src,
265bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				struct exynos_bo *dst,
266bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				enum e_g2d_buf_type type)
267bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
268bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_context *ctx;
269bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_image src_img, dst_img;
270bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int count;
271bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int src_x, src_y, dst_x, dst_y, img_w, img_h;
272bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned long userptr, size;
273bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int ret;
274bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
275bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ctx = g2d_init(dev->fd);
276bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!ctx)
277bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return -EFAULT;
278bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
279bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&src_img, 0, sizeof(struct g2d_image));
280bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&dst_img, 0, sizeof(struct g2d_image));
281bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.bo[0] = dst->handle;
282bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
283bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_x = 0;
284bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_y = 0;
285bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_x = 0;
286bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_y = 0;
287bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_w = screen_width;
288bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_h = screen_height;
289bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
290bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	switch (type) {
291bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	case G2D_IMGBUF_GEM:
292bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.bo[0] = src->handle;
293bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
294bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	case G2D_IMGBUF_USERPTR:
295bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		size = img_w * img_h * 4;
296bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
297bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		userptr = (unsigned long)malloc(size);
298bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (!userptr) {
299bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			fprintf(stderr, "failed to allocate userptr.\n");
300bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			return -EFAULT;
301bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
302bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
303bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.user_ptr[0].userptr = userptr;
304bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.user_ptr[0].size = size;
305bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
306bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	default:
307bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		type = G2D_IMGBUF_GEM;
308bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
309bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
310bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
311bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	printf("copy test with %s.\n",
312bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			type == G2D_IMGBUF_GEM ? "gem" : "userptr");
313bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
314bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.width = img_w;
315bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.height = img_h;
316bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.stride = src_img.width * 4;
317bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.buf_type = type;
318bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
319bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color = 0xffff0000;
320bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_solid_fill(ctx, &src_img, src_x, src_y, img_w, img_h);
321bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
322bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
323bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
324bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.width = img_w;
325bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.height = img_h;
326bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.stride = dst_img.width * 4;
327bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.buf_type = G2D_IMGBUF_GEM;
328bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
329bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
330bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_copy(ctx, &src_img, &dst_img, src_x, src_y, dst_x, dst_y,
331bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			img_w - 4, img_h - 4);
332bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
333bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
334bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
335bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	g2d_exec(ctx);
336bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
337bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_free_userptr:
338bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (type == G2D_IMGBUF_USERPTR)
339bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (userptr)
340bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			free((void *)userptr);
341bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
342bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	g2d_fini(ctx);
343bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
344bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return ret;
345bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
346bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
347bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic int g2d_copy_with_scale_test(struct exynos_device *dev,
348bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					struct exynos_bo *src,
349bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					struct exynos_bo *dst,
350bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					enum e_g2d_buf_type type)
351bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
352bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_context *ctx;
353bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_image src_img, dst_img;
354bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int count;
355bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int src_x, src_y, dst_x, dst_y, img_w, img_h;
356bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned long userptr, size;
357bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int ret;
358bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
359bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ctx = g2d_init(dev->fd);
360bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!ctx)
361bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return -EFAULT;
362bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
363bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&src_img, 0, sizeof(struct g2d_image));
364bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&dst_img, 0, sizeof(struct g2d_image));
365bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.bo[0] = dst->handle;
366bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
367bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_x = 0;
368bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_y = 0;
369bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_x = 0;
370bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_y = 0;
371bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_w = screen_width;
372bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_h = screen_height;
373bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
374bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	switch (type) {
375bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	case G2D_IMGBUF_GEM:
376bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.bo[0] = src->handle;
377bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
378bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	case G2D_IMGBUF_USERPTR:
379bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		size = img_w * img_h * 4;
380bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
381bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		userptr = (unsigned long)malloc(size);
382bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (!userptr) {
383bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			fprintf(stderr, "failed to allocate userptr.\n");
384bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			return -EFAULT;
385bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
386bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
387bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.user_ptr[0].userptr = userptr;
388bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.user_ptr[0].size = size;
389bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
390bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	default:
391bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		type = G2D_IMGBUF_GEM;
392bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
393bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
394bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
395bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	printf("copy and scale test with %s.\n",
396bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			type == G2D_IMGBUF_GEM ? "gem" : "userptr");
397bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
398bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.width = img_w;
399bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.height = img_h;
400bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.stride = src_img.width * 4;
401bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.buf_type = type;
402bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
403bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color = 0xffffffff;
404bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_solid_fill(ctx, &src_img, src_x, src_y, img_w ,  img_h);
405bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
406bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
407bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
408bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color = 0xff00ff00;
409bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_solid_fill(ctx, &src_img, 5, 5, 100, 100);
410bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
411bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
412bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
413bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.width = img_w;
414bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.height = img_h;
415bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.buf_type = G2D_IMGBUF_GEM;
416bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.stride = dst_img.width * 4;
417bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
418bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
419bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_copy_with_scale(ctx, &src_img, &dst_img, 5, 5, 100, 100,
420bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					100, 100, 200, 200, 0);
421bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
422bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
423bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
424bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	g2d_exec(ctx);
425bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
426bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_free_userptr:
427bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (type == G2D_IMGBUF_USERPTR)
428bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (userptr)
429bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			free((void *)userptr);
430bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
431bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	g2d_fini(ctx);
432bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
433bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return 0;
434bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
435bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
436bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic int g2d_blend_test(struct exynos_device *dev,
437bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					struct exynos_bo *src,
438bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					struct exynos_bo *dst,
439bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					enum e_g2d_buf_type type)
440bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
441bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_context *ctx;
442bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct g2d_image src_img, dst_img;
443bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int count;
444bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int src_x, src_y, dst_x, dst_y, img_w, img_h;
445bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned long userptr, size;
446bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int ret;
447bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
448bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ctx = g2d_init(dev->fd);
449bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!ctx)
450bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return -EFAULT;
451bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
452bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&src_img, 0, sizeof(struct g2d_image));
453bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&dst_img, 0, sizeof(struct g2d_image));
454bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.bo[0] = dst->handle;
455bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
456bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_x = 0;
457bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_y = 0;
458bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_x = 0;
459bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_y = 0;
460bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_w = screen_width;
461bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	img_h = screen_height;
462bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
463bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	switch (type) {
464bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	case G2D_IMGBUF_GEM:
465bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.bo[0] = src->handle;
466bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
467bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	case G2D_IMGBUF_USERPTR:
468bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		size = img_w * img_h * 4;
469bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
470bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		userptr = (unsigned long)malloc(size);
471bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (!userptr) {
472bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			fprintf(stderr, "failed to allocate userptr.\n");
473bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			return -EFAULT;
474bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
475bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
476bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.user_ptr[0].userptr = userptr;
477bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		src_img.user_ptr[0].size = size;
478bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
479bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	default:
480bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		type = G2D_IMGBUF_GEM;
481bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		break;
482bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
483bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
484bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	printf("blend test with %s.\n",
485bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			type == G2D_IMGBUF_GEM ? "gem" : "userptr");
486bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
487bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.width = img_w;
488bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.height = img_h;
489bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.stride = src_img.width * 4;
490bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.buf_type = type;
491bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.select_mode = G2D_SELECT_MODE_NORMAL;
492bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
493bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color = 0xffffffff;
494bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_solid_fill(ctx, &src_img, src_x, src_y, img_w, img_h);
495bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
496bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
497bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
498bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src_img.color = 0x770000ff;
499bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_solid_fill(ctx, &src_img, 5, 5, 200, 200);
500bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
501bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
502bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
503bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.width = img_w;
504bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.height = img_h;
505bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.stride = dst_img.width * 4;
506bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.buf_type = G2D_IMGBUF_GEM;
507bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.select_mode = G2D_SELECT_MODE_NORMAL;
508bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
509bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.color = 0xffffffff;
510bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_solid_fill(ctx, &dst_img, dst_x, dst_y, img_w, img_h);
511bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
512bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
513bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
514bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dst_img.color = 0x77ff0000;
515bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_solid_fill(ctx, &dst_img, 105, 105, 200, 200);
516bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
517bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
518bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
519bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = g2d_blend(ctx, &src_img, &dst_img, 5, 5, 105, 105, 200, 200,
520bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			G2D_OP_OVER);
521bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
522bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_userptr;
523bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
524bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	g2d_exec(ctx);
525bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
526bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_free_userptr:
527bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (type == G2D_IMGBUF_USERPTR)
528bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		if (userptr)
529bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			free((void *)userptr);
530bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
531bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	g2d_fini(ctx);
532bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
533bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return 0;
534bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
535bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
536bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic struct fimg2d_test_case test_case = {
537bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	.solid_fill = &g2d_solid_fill_test,
538bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	.copy = &g2d_copy_test,
539bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	.copy_with_scale = &g2d_copy_with_scale_test,
540bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	.blend = &g2d_blend_test,
541bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae};
542bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
543bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic void usage(char *name)
544bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
545bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	fprintf(stderr, "usage: %s [-s]\n", name);
546bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	fprintf(stderr, "-s <connector_id>@<crtc_id>:<mode>\n");
547bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	exit(0);
548bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
549bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
550bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeextern char *optarg;
551bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daestatic const char optstr[] = "s:";
552bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
553bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeint main(int argc, char **argv)
554bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae{
555bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct exynos_device *dev;
556bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct exynos_bo *bo, *src;
557bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	struct connector con;
558bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	char *modeset = NULL;
559bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	unsigned int fb_id;
560bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	uint32_t handles[4] = {0}, pitches[4] = {0}, offsets[4] = {0};
561bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmModeRes *resources;
562bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	int ret, fd, c;
563bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
564bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(&con, 0, sizeof(struct connector));
565bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
566bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (argc != 3) {
567bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		usage(argv[0]);
568bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return -EINVAL;
569bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
570bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
571bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	while ((c = getopt(argc, argv, optstr)) != -1) {
572bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		switch (c) {
573bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		case 's':
574bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			modeset = strdup(optarg);
575bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			con.crtc = -1;
576bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			if (sscanf(optarg, "%d:0x%64s",
577bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae						&con.id,
578bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae						con.mode_str) != 2 &&
579bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae					sscanf(optarg, "%d@%d:%64s",
580bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae						&con.id,
581bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae						&con.crtc,
582bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae						con.mode_str) != 3)
583bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				usage(argv[0]);
584bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			break;
585bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		default:
586bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			usage(argv[0]);
587bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			return -EINVAL;
588bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		}
589bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
590bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
591bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	fd = drmOpen(DRM_MODULE_NAME, NULL);
592bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (fd < 0) {
593bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "failed to open.\n");
594bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return fd;
595bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
596bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
597bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	dev = exynos_device_create(fd);
598bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!dev) {
599bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		drmClose(dev->fd);
600bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		return -EFAULT;
601bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
602bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
603bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	resources = drmModeGetResources(dev->fd);
604bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!resources) {
605bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "drmModeGetResources failed: %s\n",
606bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				strerror(errno));
607bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		ret = -EFAULT;
608bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_drm_close;
609bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
610bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
611bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	connector_find_mode(dev->fd, &con, resources);
612bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmModeFreeResources(resources);
613bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
614bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	screen_width = con.mode->hdisplay;
615bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	screen_height = con.mode->vdisplay;
616bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
617bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	printf("screen width  = %d, screen height = %d\n", screen_width,
618bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae			screen_height);
619bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
620bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	bo = exynos_create_buffer(dev, screen_width * screen_height * 4, 0);
621bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!bo) {
622bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		ret = -EFAULT;
623bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_drm_close;
624bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
625bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
626bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	handles[0] = bo->handle;
627bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	pitches[0] = screen_width * 4;
628bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	offsets[0] = 0;
629bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
630bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = drmModeAddFB2(dev->fd, screen_width, screen_height,
631bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				DRM_FORMAT_RGBA8888, handles,
632bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae				pitches, offsets, &fb_id, 0);
633bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
634bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_destroy_buffer;
635bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
636bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	con.plane_zpos = -1;
637bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
638bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	memset(bo->vaddr, 0xff, screen_width * screen_height * 4);
639bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
640bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = drm_set_crtc(dev, &con, fb_id);
641bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
642bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_rm_fb;
643bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
644bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = test_case.solid_fill(dev, bo);
645bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0) {
646bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "failed to solid fill operation.\n");
647bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_rm_fb;
648bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
649bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
650bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	getchar();
651bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
652bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	src = exynos_create_buffer(dev, screen_width * screen_height * 4, 0);
653bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (!src) {
654bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		ret = -EFAULT;
655bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_rm_fb;
656bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
657bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
658bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = test_case.copy(dev, src, bo, G2D_IMGBUF_GEM);
659bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0) {
660bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "failed to test copy operation.\n");
661bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_src;
662bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
663bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
664bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	getchar();
665bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
666bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret = test_case.copy_with_scale(dev, src, bo, G2D_IMGBUF_GEM);
667bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0) {
668bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "failed to test copy and scale operation.\n");
669bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		goto err_free_src;
670bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	}
671bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
672bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	getchar();
673bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
674bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	ret  = test_case.blend(dev, src, bo, G2D_IMGBUF_USERPTR);
675bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (ret < 0)
676bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		fprintf(stderr, "failed to test blend operation.\n");
677bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
678bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	getchar();
679bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
680bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_free_src:
681bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	if (src)
682bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae		exynos_destroy_buffer(src);
683bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
684bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_rm_fb:
685d1000c432c8ce76ea64f7f9eb6094d11542e0495Daniel Kurtz	drmModeRmFB(dev->fd, fb_id);
686bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
687bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_destroy_buffer:
688bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	exynos_destroy_buffer(bo);
689bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
690bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Daeerr_drm_close:
691bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	drmClose(dev->fd);
692bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	exynos_device_destroy(dev);
693bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae
694bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae	return 0;
695bbf6e3dea3c79ea8e0c3e1dd8f80014201e003fcInki Dae}
696