| #include "drm_setup.h" |
| #include "memutil.h" |
| |
| #include <stdio.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| |
| struct drm_test_info *drm_test_setup(int argc, char **argv) |
| { |
| struct drm_test_info *info; |
| drmVersionPtr version; |
| |
| if (argc < 2) { |
| printf("Usage: %s /dev/dri/...\n", argv[0]); |
| return NULL; |
| } |
| info = CALLOC_STRUCT(drm_test_info); |
| info->fd = open(argv[1], O_RDWR); |
| if (info->fd < 0) { |
| fprintf(stdout, "Unable to open %s\n", argv[1]); |
| goto out; |
| } |
| |
| version = drmGetVersion(info->fd); |
| if (version) { |
| printf("Version: %d.%d.%d\n", version->version_major, |
| version->version_minor, version->version_patchlevel); |
| printf(" Name: %s\n", version->name); |
| printf(" Date: %s\n", version->date); |
| printf(" Description: %s\n", version->desc); |
| drmFreeVersion(version); |
| } |
| |
| info->dev = etna_device_new(info->fd); |
| if (!info->dev) { |
| fprintf(stdout, "Unable to create device\n"); |
| goto out; |
| } |
| |
| /* TODO: we assume that core 1 is a 3D+CL capable one. |
| * This is pretty much only true for i.MX6q(p). |
| * If the tests don't work on your hardware check this carefully. |
| */ |
| info->gpu = etna_gpu_new(info->dev, 1); |
| if (!info->gpu) { |
| fprintf(stdout, "Unable to create gpu\n"); |
| goto out_device; |
| } |
| |
| info->pipe = etna_pipe_new(info->gpu, ETNA_PIPE_3D); |
| if (!info->pipe) { |
| fprintf(stdout, "Unable to create pipe\n"); |
| goto out_gpu; |
| } |
| |
| info->stream = etna_cmd_stream_new(info->pipe, 0x3000, NULL, NULL); |
| if (!info->stream) { |
| fprintf(stdout, "Unable to create command stream\n"); |
| goto out_pipe; |
| } |
| return info; |
| |
| out_pipe: |
| etna_pipe_del(info->pipe); |
| |
| out_gpu: |
| etna_gpu_del(info->gpu); |
| |
| out_device: |
| etna_device_del(info->dev); |
| |
| out: |
| close(info->fd); |
| free(info); |
| return NULL; |
| } |
| |
| void drm_test_teardown(struct drm_test_info *info) |
| { |
| etna_cmd_stream_del(info->stream); |
| etna_pipe_del(info->pipe); |
| etna_gpu_del(info->gpu); |
| etna_device_del(info->dev); |
| close(info->fd); |
| free(info); |
| } |
| |