mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-12 10:26:12 +00:00
testdisplay: Clarify
Move the loop operations around for test_all_modes so that it is clearly split up into the desired phases. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
62d516813a
commit
5534cb1c75
@ -60,10 +60,11 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
#include "xf86drm.h"
|
#include "xf86drm.h"
|
||||||
#include "xf86drmMode.h"
|
#include "xf86drmMode.h"
|
||||||
#include "intel_bufmgr.h"
|
|
||||||
#include "i915_drm.h"
|
#include "i915_drm.h"
|
||||||
|
|
||||||
struct udev_monitor *uevent_monitor;
|
struct udev_monitor *uevent_monitor;
|
||||||
@ -313,19 +314,54 @@ static void connector_find_preferred_mode(struct connector *c)
|
|||||||
c->connector = connector;
|
c->connector = connector;
|
||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static uint32_t gem_create(int fd, int size)
|
||||||
allocate_buffer(drm_intel_bufmgr *bufmgr,
|
|
||||||
int width, int height, int *stride)
|
|
||||||
{
|
{
|
||||||
int size;
|
struct drm_i915_gem_create create;
|
||||||
|
|
||||||
|
create.handle = 0;
|
||||||
|
create.size = (size + 4095) & -4096;
|
||||||
|
(void)drmIoctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create);
|
||||||
|
|
||||||
|
return create.handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *gem_mmap(int fd, uint32_t handle, int size, int prot)
|
||||||
|
{
|
||||||
|
struct drm_i915_gem_mmap_gtt mmap_arg;
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
mmap_arg.handle = handle;
|
||||||
|
if (drmIoctl(fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &mmap_arg))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ptr = mmap(0, size, prot, MAP_SHARED, fd, mmap_arg.offset);
|
||||||
|
if (ptr == MAP_FAILED)
|
||||||
|
ptr = NULL;
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gem_close(int fd, uint32_t handle)
|
||||||
|
{
|
||||||
|
struct drm_gem_close close;
|
||||||
|
|
||||||
|
close.handle = handle;
|
||||||
|
(void)drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &close);
|
||||||
|
}
|
||||||
|
|
||||||
|
static cairo_surface_t *
|
||||||
|
allocate_surface(int fd, int width, int height, uint32_t *handle)
|
||||||
|
{
|
||||||
|
int size, stride;
|
||||||
|
|
||||||
/* Scan-out has a 64 byte alignment restriction */
|
/* Scan-out has a 64 byte alignment restriction */
|
||||||
width *= 4; /* 32bpp */
|
stride = (width*4 + 63) & -64;
|
||||||
size = (width + 63) & -64;
|
size = stride * height;
|
||||||
*stride = size;
|
|
||||||
size *= height;
|
|
||||||
|
|
||||||
return drm_intel_bo_alloc(bufmgr, "frontbuffer", size, 0);
|
*handle = gem_create(fd, size);
|
||||||
|
return cairo_image_surface_create_for_data
|
||||||
|
(gem_mmap(fd, *handle, size, PROT_READ | PROT_WRITE),
|
||||||
|
CAIRO_FORMAT_ARGB32, width, height, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum corner {
|
enum corner {
|
||||||
@ -475,95 +511,57 @@ paint_output_info(cairo_t *cr, struct connector *c, int width, int height)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
create_test_buffer(drm_intel_bufmgr *bufmgr, int width, int height,
|
|
||||||
int *stride_out, drm_intel_bo **bo_out)
|
|
||||||
{
|
|
||||||
drm_intel_bo *bo;
|
|
||||||
int ret, stride;
|
|
||||||
|
|
||||||
bo = allocate_buffer(bufmgr, width, height, &stride);
|
|
||||||
if (!bo) {
|
|
||||||
fprintf(stderr, "failed to alloc buffer: %s\n",
|
|
||||||
|
|
||||||
strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = drm_intel_gem_bo_map_gtt(bo);
|
|
||||||
if (ret) {
|
|
||||||
fprintf(stderr, "failed to GTT map buffer: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*bo_out = bo;
|
|
||||||
*stride_out = stride;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_mode(struct connector *c)
|
set_mode(struct connector *c)
|
||||||
{
|
{
|
||||||
drm_intel_bufmgr *bufmgr;
|
|
||||||
drm_intel_bo *bo;
|
|
||||||
unsigned int fb_id;
|
unsigned int fb_id;
|
||||||
int ret, width, height, stride;
|
int ret, width, height;
|
||||||
cairo_surface_t *surface;
|
|
||||||
cairo_t *cr;
|
|
||||||
char buf[128];
|
char buf[128];
|
||||||
int j, test_mode_num;
|
int j, test_mode_num;
|
||||||
|
|
||||||
width = 0;
|
|
||||||
height = 0;
|
|
||||||
connector_find_preferred_mode(c);
|
connector_find_preferred_mode(c);
|
||||||
if (!c->mode_valid)
|
if (!c->mode_valid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (test_preferred_mode || force_mode)
|
test_mode_num = 1;
|
||||||
test_mode_num = 1;
|
if (force_mode){
|
||||||
if (test_all_modes)
|
c->mode.clock = force_clock*1000;
|
||||||
|
c->mode.hdisplay = force_hdisplay;
|
||||||
|
c->mode.hsync_start = force_hsync_start;
|
||||||
|
c->mode.hsync_end = force_hsync_end;
|
||||||
|
c->mode.htotal = force_htotal;
|
||||||
|
c->mode.vdisplay = force_vdisplay;
|
||||||
|
c->mode.vsync_start = force_vsync_start;
|
||||||
|
c->mode.vsync_end = force_vsync_end;
|
||||||
|
c->mode.vtotal = force_vtotal;
|
||||||
|
c->mode.vrefresh =(force_clock*1e6)/(force_htotal*force_vtotal);
|
||||||
|
c->mode_valid = 1;
|
||||||
|
sprintf(c->mode.name, "%dx%d", force_hdisplay, force_vdisplay);
|
||||||
|
} else if (test_all_modes)
|
||||||
test_mode_num = c->connector->count_modes;
|
test_mode_num = c->connector->count_modes;
|
||||||
|
|
||||||
for (j = 0; j < test_mode_num; j++) {
|
for (j = 0; j < test_mode_num; j++) {
|
||||||
|
cairo_surface_t *surface;
|
||||||
|
cairo_status_t status;
|
||||||
|
cairo_t *cr;
|
||||||
|
uint32_t handle;
|
||||||
|
|
||||||
if (test_all_modes)
|
if (test_all_modes)
|
||||||
c->mode = c->connector->modes[j];
|
c->mode = c->connector->modes[j];
|
||||||
width = 0;
|
|
||||||
height = 0;
|
if (!c->mode_valid)
|
||||||
width += c->mode.hdisplay;
|
continue;
|
||||||
if (height < c->mode.vdisplay)
|
|
||||||
height = c->mode.vdisplay;
|
width = c->mode.hdisplay;
|
||||||
if (force_mode){
|
height = c->mode.vdisplay;
|
||||||
width = force_hdisplay;
|
|
||||||
height = force_vdisplay;
|
surface = allocate_surface(fd, width, height, &handle);
|
||||||
c->mode.clock = force_clock*1000;
|
if (!surface) {
|
||||||
c->mode.hdisplay = force_hdisplay;
|
fprintf(stderr, "allocation failed %dx%d\n", width, height);
|
||||||
c->mode.hsync_start = force_hsync_start;
|
continue;
|
||||||
c->mode.hsync_end = force_hsync_end;
|
|
||||||
c->mode.htotal = force_htotal;
|
|
||||||
c->mode.vdisplay = force_vdisplay;
|
|
||||||
c->mode.vsync_start = force_vsync_start;
|
|
||||||
c->mode.vsync_end = force_vsync_end;
|
|
||||||
c->mode.vtotal = force_vtotal;
|
|
||||||
c->mode.vrefresh =(force_clock*1e6)/(force_htotal*force_vtotal);
|
|
||||||
sprintf(c->mode.name,"%d%s%d",width,"x",height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bufmgr = drm_intel_bufmgr_gem_init(fd, 2<<20);
|
|
||||||
if (!bufmgr) {
|
|
||||||
fprintf(stderr, "failed to init bufmgr: %s\n", strerror(errno));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (create_test_buffer(bufmgr, width, height, &stride, &bo))
|
|
||||||
return;
|
|
||||||
|
|
||||||
surface = cairo_image_surface_create_for_data(bo->virtual,
|
|
||||||
CAIRO_FORMAT_ARGB32,
|
|
||||||
width, height,
|
|
||||||
stride);
|
|
||||||
cr = cairo_create(surface);
|
cr = cairo_create(surface);
|
||||||
cairo_surface_destroy(surface);
|
|
||||||
|
|
||||||
cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
|
cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
|
||||||
|
|
||||||
@ -580,31 +578,37 @@ set_mode(struct connector *c)
|
|||||||
/* Paint output info */
|
/* Paint output info */
|
||||||
paint_output_info(cr, c, width, height);
|
paint_output_info(cr, c, width, height);
|
||||||
|
|
||||||
|
status = cairo_status(cr);
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
drm_intel_gem_bo_unmap_gtt(bo);
|
if (status)
|
||||||
|
fprintf(stderr, "failed to draw pretty picture %x%d: %s\n",
|
||||||
|
width, height, cairo_status_to_string(status));
|
||||||
|
|
||||||
|
ret = drmModeAddFB(fd, width, height, 32, 32,
|
||||||
|
cairo_image_surface_get_stride(surface),
|
||||||
|
handle, &fb_id);
|
||||||
|
cairo_surface_destroy(surface);
|
||||||
|
gem_close(fd, handle);
|
||||||
|
|
||||||
ret = drmModeAddFB(fd, width, height, 32, 32, stride, bo->handle,
|
|
||||||
&fb_id);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
fprintf(stderr, "failed to add fb (width=%d, height=%d): %s\n",
|
fprintf(stderr, "failed to add fb (%dx%d): %s\n",
|
||||||
width, height, strerror(errno));
|
width, height, strerror(errno));
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!c->mode_valid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
dump_mode(&c->mode);
|
dump_mode(&c->mode);
|
||||||
ret = drmModeSetCrtc(fd, c->crtc, fb_id, 0, 0,
|
if (drmModeSetCrtc(fd, c->crtc, fb_id, 0, 0,
|
||||||
&c->id, 1, &c->mode);
|
&c->id, 1, &c->mode)) {
|
||||||
if (ret) {
|
fprintf(stderr, "failed to set mode (%dx%d@%dHz): %s\n",
|
||||||
fprintf(stderr, "failed to set mode: %s\n", strerror(errno));
|
width, height, c->mode.vrefresh,
|
||||||
return;
|
strerror(errno));
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sleep_between_modes && test_all_modes)
|
if (sleep_between_modes && test_all_modes)
|
||||||
sleep(5);
|
sleep(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
drmModeFreeEncoder(c->encoder);
|
drmModeFreeEncoder(c->encoder);
|
||||||
drmModeFreeConnector(c->connector);
|
drmModeFreeConnector(c->connector);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user