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