mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-18 21:36:27 +00:00
Initial import of intel-graphics-tools with some microbenchmarks.
This commit is contained in:
commit
8c64183a46
32
.gitignore
vendored
Normal file
32
.gitignore
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
.deps
|
||||||
|
.libs
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*~
|
||||||
|
aclocal.m4
|
||||||
|
autom4te.cache
|
||||||
|
compile
|
||||||
|
config.guess
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config.status
|
||||||
|
config.sub
|
||||||
|
configure
|
||||||
|
configure.lineno
|
||||||
|
depcomp
|
||||||
|
doltcompile
|
||||||
|
doltlibtool
|
||||||
|
install-sh
|
||||||
|
libtool
|
||||||
|
ltmain.sh
|
||||||
|
missing
|
||||||
|
shave
|
||||||
|
shave-libtool
|
||||||
|
stamp-h1
|
||||||
|
cscope.*
|
||||||
|
benchmarks/intel_upload_blit_large
|
||||||
|
benchmarks/intel_upload_blit_small
|
25
Makefile.am
Normal file
25
Makefile.am
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Copyright © 2005 Adam Jackson.
|
||||||
|
# Copyright © 2009 Intel Corporation
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
# copy of this software and associated documentation files (the "Software"),
|
||||||
|
# to deal in the Software without restriction, including without limitation
|
||||||
|
# on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||||
|
# license, and/or sell copies of the Software, and to permit persons to whom
|
||||||
|
# the Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice (including the next
|
||||||
|
# paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
# Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
# ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
SUBDIRS = tests tools benchmarks
|
25
README
Normal file
25
README
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
This is a collection of tools for development and testing of the Intel DRM
|
||||||
|
driver. There are many macro-level test suites that get used against our
|
||||||
|
driver, including xtest, rendercheck, piglit, and oglconform, but failures
|
||||||
|
from those can be difficult to track down to kernel changes, and many require
|
||||||
|
complicated build procedures or specific testing environments to get useful
|
||||||
|
results.
|
||||||
|
|
||||||
|
Thus, intel-graphics-tools was a project I started to collect some low-level
|
||||||
|
tools I intended to build. There are 3 subdirectories:
|
||||||
|
|
||||||
|
benchmarks/
|
||||||
|
This should be a collection of useful microbenchmarks. The hope is
|
||||||
|
that people can use these to tune some pieces of DRM code in relevant
|
||||||
|
ways.
|
||||||
|
|
||||||
|
tests/
|
||||||
|
This is a set of automated tests to run against the DRM to validate
|
||||||
|
changes. Hopefully this can cover the relevant cases we need to
|
||||||
|
worry about, including backwards compatibility.
|
||||||
|
|
||||||
|
tools/
|
||||||
|
This is a collection of debugging tools that had previously been
|
||||||
|
built with the 2D driver but not shipped. Some distros were hacking
|
||||||
|
up the 2D build to ship them. Instead, here's a separate package for
|
||||||
|
people debugging the driver.
|
12
autogen.sh
Executable file
12
autogen.sh
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
srcdir=`dirname $0`
|
||||||
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
|
ORIGDIR=`pwd`
|
||||||
|
cd $srcdir
|
||||||
|
|
||||||
|
autoreconf -v --install || exit 1
|
||||||
|
cd $ORIGDIR || exit $?
|
||||||
|
|
||||||
|
$srcdir/configure --enable-maintainer-mode "$@"
|
14
benchmarks/Makefile.am
Normal file
14
benchmarks/Makefile.am
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
bin_PROGRAMS = \
|
||||||
|
intel_upload_blit_large \
|
||||||
|
intel_upload_blit_small
|
||||||
|
|
||||||
|
BENCHMARK_LIBS = \
|
||||||
|
../lib/libintel_tools.la \
|
||||||
|
$(DRM_LIBS)
|
||||||
|
|
||||||
|
intel_upload_blit_large_LDADD = $(BENCHMARK_LIBS)
|
||||||
|
intel_upload_blit_small_LDADD = $(BENCHMARK_LIBS)
|
||||||
|
|
||||||
|
AM_CFLAGS = $(DRM_CFLAGS) $(WARN_CFLAGS) \
|
||||||
|
-I$(srcdir)/.. \
|
||||||
|
-I$(srcdir)/../lib
|
157
benchmarks/intel_upload_blit_large.c
Normal file
157
benchmarks/intel_upload_blit_large.c
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2009 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice (including the next
|
||||||
|
* paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
* Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Eric Anholt <eric@anholt.net>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Roughly simulates repeatedly uploading frames of images, by uploading
|
||||||
|
* the data all at once with pwrite, and then blitting it to another buffer.
|
||||||
|
*
|
||||||
|
* You might think of this like a movie player, but that wouldn't be entirely
|
||||||
|
* accurate, since the access patterns of the memory would be different
|
||||||
|
* (generally, smaller source image, upscaled, an thus different memory access
|
||||||
|
* pattern in both texel fetch for the stretching and the destination writes).
|
||||||
|
* However, some things like swfdec would be doing something like this since
|
||||||
|
* they compute their data in host memory and upload the full sw rendered
|
||||||
|
* frame.
|
||||||
|
*
|
||||||
|
* Additionally, those applications should be rendering at the screen refresh
|
||||||
|
* rate, while this test has no limits, and so can get itself into the
|
||||||
|
* working set larger than aperture size performance disaster.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include "drm.h"
|
||||||
|
#include "i915_drm.h"
|
||||||
|
#include "drmtest.h"
|
||||||
|
#include "intel_bufmgr.h"
|
||||||
|
#include "intel_batchbuffer.h"
|
||||||
|
|
||||||
|
#define OBJECT_WIDTH 1280
|
||||||
|
#define OBJECT_HEIGHT 720
|
||||||
|
|
||||||
|
static double
|
||||||
|
get_time_in_secs(void)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
|
return (double)tv.tv_sec + tv.tv_usec / 1000000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_render(drm_intel_bufmgr *bufmgr, struct intel_batchbuffer *batch,
|
||||||
|
drm_intel_bo *dst_bo, int width, int height)
|
||||||
|
{
|
||||||
|
uint32_t data[width * height];
|
||||||
|
drm_intel_bo *src_bo;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Generate some junk. Real workloads would be doing a lot more
|
||||||
|
* work to generate the junk.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < width * height; i++) {
|
||||||
|
data[i] = (uint32_t)random();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Upload the junk. */
|
||||||
|
src_bo = drm_intel_bo_alloc(bufmgr, "src", sizeof(data), 4096);
|
||||||
|
drm_intel_bo_subdata(src_bo, 0, sizeof(data), data);
|
||||||
|
|
||||||
|
/* Render the junk to the dst. */
|
||||||
|
BEGIN_BATCH(8);
|
||||||
|
OUT_BATCH(XY_SRC_COPY_BLT_CMD |
|
||||||
|
XY_SRC_COPY_BLT_WRITE_ALPHA |
|
||||||
|
XY_SRC_COPY_BLT_WRITE_RGB);
|
||||||
|
OUT_BATCH((3 << 24) | /* 32 bits */
|
||||||
|
(0xcc << 16) | /* copy ROP */
|
||||||
|
(width * 4) /* dst pitch */);
|
||||||
|
OUT_BATCH(0); /* dst x1,y1 */
|
||||||
|
OUT_BATCH((height << 16) | width); /* dst x2,y2 */
|
||||||
|
OUT_RELOC(dst_bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
|
||||||
|
OUT_BATCH(0); /* src x1,y1 */
|
||||||
|
OUT_BATCH(width * 4); /* src pitch */
|
||||||
|
OUT_RELOC(src_bo, I915_GEM_DOMAIN_RENDER, 0, 0);
|
||||||
|
ADVANCE_BATCH();
|
||||||
|
|
||||||
|
intel_batchbuffer_flush(batch);
|
||||||
|
|
||||||
|
drm_intel_bo_unreference(src_bo);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
int object_size = OBJECT_WIDTH * OBJECT_HEIGHT * 4;
|
||||||
|
double start_time, end_time;
|
||||||
|
drm_intel_bo *dst_bo;
|
||||||
|
drm_intel_bufmgr *bufmgr;
|
||||||
|
struct intel_batchbuffer *batch;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fd = drm_open_any();
|
||||||
|
|
||||||
|
bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
|
||||||
|
drm_intel_bufmgr_gem_enable_reuse(bufmgr);
|
||||||
|
|
||||||
|
batch = intel_batchbuffer_alloc(bufmgr);
|
||||||
|
|
||||||
|
dst_bo = drm_intel_bo_alloc(bufmgr, "dst", object_size, 4096);
|
||||||
|
|
||||||
|
/* Prep loop to get us warmed up. */
|
||||||
|
for (i = 0; i < 60; i++) {
|
||||||
|
do_render(bufmgr, batch, dst_bo, OBJECT_WIDTH, OBJECT_HEIGHT);
|
||||||
|
}
|
||||||
|
drm_intel_bo_wait_rendering(dst_bo);
|
||||||
|
|
||||||
|
/* Do the actual timing. */
|
||||||
|
start_time = get_time_in_secs();
|
||||||
|
for (i = 0; i < 200; i++) {
|
||||||
|
do_render(bufmgr, batch, dst_bo, OBJECT_WIDTH, OBJECT_HEIGHT);
|
||||||
|
}
|
||||||
|
drm_intel_bo_wait_rendering(dst_bo);
|
||||||
|
end_time = get_time_in_secs();
|
||||||
|
|
||||||
|
printf("%d iterations in %.03f secs: %.01f MB/sec\n", i,
|
||||||
|
end_time - start_time,
|
||||||
|
(double)OBJECT_WIDTH * OBJECT_HEIGHT * 4 /
|
||||||
|
(end_time - start_time));
|
||||||
|
|
||||||
|
intel_batchbuffer_free(batch);
|
||||||
|
drm_intel_bufmgr_destroy(bufmgr);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
172
benchmarks/intel_upload_blit_small.c
Normal file
172
benchmarks/intel_upload_blit_small.c
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2009 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice (including the next
|
||||||
|
* paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
* Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Eric Anholt <eric@anholt.net>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Roughly simulates Mesa's current vertex buffer behavior: do a series of
|
||||||
|
* small pwrites on a moderately-sized buffer, then render using it.
|
||||||
|
*
|
||||||
|
* The vertex buffer uploads
|
||||||
|
*
|
||||||
|
* You might think of this like a movie player, but that wouldn't be entirely
|
||||||
|
* accurate, since the access patterns of the memory would be different
|
||||||
|
* (generally, smaller source image, upscaled, an thus different memory access
|
||||||
|
* pattern in both texel fetch for the stretching and the destination writes).
|
||||||
|
* However, some things like swfdec would be doing something like this since
|
||||||
|
* they compute their data in host memory and upload the full sw rendered
|
||||||
|
* frame.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include "drm.h"
|
||||||
|
#include "i915_drm.h"
|
||||||
|
#include "drmtest.h"
|
||||||
|
#include "intel_bufmgr.h"
|
||||||
|
#include "intel_batchbuffer.h"
|
||||||
|
|
||||||
|
/* Happens to be 128k, the size of the VBOs used by i965's Mesa driver. */
|
||||||
|
#define OBJECT_WIDTH 256
|
||||||
|
#define OBJECT_HEIGHT 128
|
||||||
|
|
||||||
|
static double
|
||||||
|
get_time_in_secs(void)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
|
return (double)tv.tv_sec + tv.tv_usec / 1000000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_render(drm_intel_bufmgr *bufmgr, struct intel_batchbuffer *batch,
|
||||||
|
drm_intel_bo *dst_bo, int width, int height)
|
||||||
|
{
|
||||||
|
uint32_t data[64];
|
||||||
|
drm_intel_bo *src_bo;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
src_bo = drm_intel_bo_alloc(bufmgr, "src", width * height * 4, 4096);
|
||||||
|
|
||||||
|
/* Upload some junk. Real workloads would be doing a lot more
|
||||||
|
* work to generate the junk.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < width * height;) {
|
||||||
|
int size, j;
|
||||||
|
|
||||||
|
/* Choose a size from 1 to 64 dwords to upload.
|
||||||
|
* Normal workloads have a distribution of sizes with a
|
||||||
|
* large tail (something in your scene's going to have a big
|
||||||
|
* pile of vertices, most likely), but I'm trying to get at
|
||||||
|
* the cost of the small uploads here.
|
||||||
|
*/
|
||||||
|
size = random() % 64 + 1;
|
||||||
|
if (i + size > width * height)
|
||||||
|
size = width * height - i;
|
||||||
|
|
||||||
|
for (j = 0; j < size; j++)
|
||||||
|
data[j] = (uint32_t)random();
|
||||||
|
|
||||||
|
/* Upload the junk. */
|
||||||
|
drm_intel_bo_subdata(src_bo, i * 4, size * 4, data);
|
||||||
|
|
||||||
|
i += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Render the junk to the dst. */
|
||||||
|
BEGIN_BATCH(8);
|
||||||
|
OUT_BATCH(XY_SRC_COPY_BLT_CMD |
|
||||||
|
XY_SRC_COPY_BLT_WRITE_ALPHA |
|
||||||
|
XY_SRC_COPY_BLT_WRITE_RGB);
|
||||||
|
OUT_BATCH((3 << 24) | /* 32 bits */
|
||||||
|
(0xcc << 16) | /* copy ROP */
|
||||||
|
(width * 4) /* dst pitch */);
|
||||||
|
OUT_BATCH(0); /* dst x1,y1 */
|
||||||
|
OUT_BATCH((height << 16) | width); /* dst x2,y2 */
|
||||||
|
OUT_RELOC(dst_bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
|
||||||
|
OUT_BATCH(0); /* src x1,y1 */
|
||||||
|
OUT_BATCH(width * 4); /* src pitch */
|
||||||
|
OUT_RELOC(src_bo, I915_GEM_DOMAIN_RENDER, 0, 0);
|
||||||
|
ADVANCE_BATCH();
|
||||||
|
|
||||||
|
intel_batchbuffer_flush(batch);
|
||||||
|
|
||||||
|
drm_intel_bo_unreference(src_bo);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
int object_size = OBJECT_WIDTH * OBJECT_HEIGHT * 4;
|
||||||
|
double start_time, end_time;
|
||||||
|
drm_intel_bo *dst_bo;
|
||||||
|
drm_intel_bufmgr *bufmgr;
|
||||||
|
struct intel_batchbuffer *batch;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fd = drm_open_any();
|
||||||
|
|
||||||
|
bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
|
||||||
|
drm_intel_bufmgr_gem_enable_reuse(bufmgr);
|
||||||
|
|
||||||
|
batch = intel_batchbuffer_alloc(bufmgr);
|
||||||
|
|
||||||
|
dst_bo = drm_intel_bo_alloc(bufmgr, "dst", object_size, 4096);
|
||||||
|
|
||||||
|
/* Prep loop to get us warmed up. */
|
||||||
|
for (i = 0; i < 20; i++) {
|
||||||
|
do_render(bufmgr, batch, dst_bo, OBJECT_WIDTH, OBJECT_HEIGHT);
|
||||||
|
}
|
||||||
|
drm_intel_bo_wait_rendering(dst_bo);
|
||||||
|
|
||||||
|
/* Do the actual timing. */
|
||||||
|
start_time = get_time_in_secs();
|
||||||
|
for (i = 0; i < 1000; i++) {
|
||||||
|
do_render(bufmgr, batch, dst_bo, OBJECT_WIDTH, OBJECT_HEIGHT);
|
||||||
|
}
|
||||||
|
drm_intel_bo_wait_rendering(dst_bo);
|
||||||
|
end_time = get_time_in_secs();
|
||||||
|
|
||||||
|
printf("%d iterations in %.03f secs: %.01f MB/sec\n", i,
|
||||||
|
end_time - start_time,
|
||||||
|
(double)OBJECT_WIDTH * OBJECT_HEIGHT * 4 /
|
||||||
|
(end_time - start_time));
|
||||||
|
|
||||||
|
intel_batchbuffer_free(batch);
|
||||||
|
drm_intel_bufmgr_destroy(bufmgr);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
70
configure.ac
Normal file
70
configure.ac
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
# Copyright 2005 Adam Jackson.
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
# copy of this software and associated documentation files (the "Software"),
|
||||||
|
# to deal in the Software without restriction, including without limitation
|
||||||
|
# on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||||
|
# license, and/or sell copies of the Software, and to permit persons to whom
|
||||||
|
# the Software is furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice (including the next
|
||||||
|
# paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
# Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
# ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Process this file with autoconf to produce a configure script
|
||||||
|
|
||||||
|
AC_PREREQ(2.57)
|
||||||
|
AC_INIT([xf86-video-intel],
|
||||||
|
2.6.99.1,
|
||||||
|
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
|
||||||
|
xf86-video-intel)
|
||||||
|
|
||||||
|
AC_CONFIG_SRCDIR([Makefile.am])
|
||||||
|
AM_CONFIG_HEADER([config.h])
|
||||||
|
AC_CONFIG_AUX_DIR(.)
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||||
|
|
||||||
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
shave
|
||||||
|
shave-libtool
|
||||||
|
])
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_DISABLE_STATIC
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
DOLT
|
||||||
|
AC_PROG_CC
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(DRM, [libdrm_intel >= 2.4.5])
|
||||||
|
PKG_CHECK_MODULES(PCIACCESS, [pciaccess >= 0.10])
|
||||||
|
|
||||||
|
dnl Use lots of warning flags with GCC
|
||||||
|
|
||||||
|
WARN_CFLAGS=""
|
||||||
|
|
||||||
|
if test "x$GCC" = "xyes"; then
|
||||||
|
WARN_CFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes \
|
||||||
|
-Wmissing-prototypes -Wmissing-declarations \
|
||||||
|
-Wnested-externs -fno-strict-aliasing"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST([WARN_CFLAGS])
|
||||||
|
|
||||||
|
SHAVE_INIT([.], [enable])
|
||||||
|
|
||||||
|
AC_OUTPUT([
|
||||||
|
Makefile
|
||||||
|
benchmarks/Makefile
|
||||||
|
lib/Makefile
|
||||||
|
])
|
2872
i810_reg.h
Normal file
2872
i810_reg.h
Normal file
File diff suppressed because it is too large
Load Diff
10
lib/Makefile.am
Normal file
10
lib/Makefile.am
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
libintel_tools_la_SOURCES = \
|
||||||
|
intel_batchbuffer.c \
|
||||||
|
intel_batchbuffer.h \
|
||||||
|
drmtest.c \
|
||||||
|
drmtest.h
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libintel_tools.la
|
||||||
|
|
||||||
|
AM_CFLAGS = $(DRM_CFLAGS) $(WARN_CFLAGS) \
|
||||||
|
-I$(srcdir)/..
|
84
lib/drmtest.c
Normal file
84
lib/drmtest.c
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2007 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice (including the next
|
||||||
|
* paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
* Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Eric Anholt <eric@anholt.net>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include "drmtest.h"
|
||||||
|
|
||||||
|
/** Open the first DRM device we can find, searching up to 16 device nodes */
|
||||||
|
int drm_open_any(void)
|
||||||
|
{
|
||||||
|
char name[20];
|
||||||
|
int i, fd;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
sprintf(name, "/dev/dri/card%d", i);
|
||||||
|
fd = open(name, O_RDWR);
|
||||||
|
if (fd != -1)
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the first DRM device we can find where we end up being the master.
|
||||||
|
*/
|
||||||
|
int drm_open_any_master(void)
|
||||||
|
{
|
||||||
|
char name[20];
|
||||||
|
int i, fd;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
drm_client_t client;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
sprintf(name, "/dev/dri/card%d", i);
|
||||||
|
fd = open(name, O_RDWR);
|
||||||
|
if (fd == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Check that we're the only opener and authed. */
|
||||||
|
client.idx = 0;
|
||||||
|
ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
|
||||||
|
assert (ret == 0);
|
||||||
|
if (!client.auth) {
|
||||||
|
close(fd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
client.idx = 1;
|
||||||
|
ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
|
||||||
|
if (ret != -1 || errno != EINVAL) {
|
||||||
|
close(fd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "Couldn't find an un-controlled DRM device\n");
|
||||||
|
abort();
|
||||||
|
}
|
37
lib/drmtest.h
Normal file
37
lib/drmtest.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2007 Intel Corporation
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice (including the next
|
||||||
|
* paragraph) shall be included in all copies or substantial portions of the
|
||||||
|
* Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
* IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Eric Anholt <eric@anholt.net>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "xf86drm.h"
|
||||||
|
|
||||||
|
int drm_open_any(void);
|
||||||
|
int drm_open_any_master(void);
|
139
lib/intel_batchbuffer.c
Normal file
139
lib/intel_batchbuffer.c
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sub license, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice (including the
|
||||||
|
* next paragraph) shall be included in all copies or substantial portions
|
||||||
|
* of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||||
|
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||||
|
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include "drm.h"
|
||||||
|
#include "intel_batchbuffer.h"
|
||||||
|
#include "intel_bufmgr.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_batchbuffer_reset(struct intel_batchbuffer *batch)
|
||||||
|
{
|
||||||
|
if (batch->bo != NULL) {
|
||||||
|
drm_intel_bo_unreference(batch->bo);
|
||||||
|
batch->bo = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!batch->buffer)
|
||||||
|
batch->buffer = malloc(BATCH_SZ);
|
||||||
|
|
||||||
|
batch->bo = drm_intel_bo_alloc(batch->bufmgr, "batchbuffer",
|
||||||
|
BATCH_SZ, 4096);
|
||||||
|
|
||||||
|
batch->map = batch->buffer;
|
||||||
|
batch->size = BATCH_SZ;
|
||||||
|
batch->ptr = batch->map;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct intel_batchbuffer *
|
||||||
|
intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr)
|
||||||
|
{
|
||||||
|
struct intel_batchbuffer *batch = calloc(sizeof(*batch), 1);
|
||||||
|
|
||||||
|
batch->bufmgr = bufmgr;
|
||||||
|
intel_batchbuffer_reset(batch);
|
||||||
|
|
||||||
|
return batch;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_batchbuffer_free(struct intel_batchbuffer *batch)
|
||||||
|
{
|
||||||
|
free (batch->buffer);
|
||||||
|
|
||||||
|
drm_intel_bo_unreference(batch->bo);
|
||||||
|
batch->bo = NULL;
|
||||||
|
free(batch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_batchbuffer_flush(struct intel_batchbuffer *batch)
|
||||||
|
{
|
||||||
|
unsigned int used = batch->ptr - batch->map;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (used == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Round batchbuffer usage to 2 DWORDs. */
|
||||||
|
if ((used & 4) == 0) {
|
||||||
|
*(uint32_t *) (batch->ptr) = 0; /* noop */
|
||||||
|
batch->ptr += 4;
|
||||||
|
used = batch->ptr - batch->map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mark the end of the buffer. */
|
||||||
|
*(uint32_t *) (batch->ptr) = MI_BATCH_BUFFER_END; /* noop */
|
||||||
|
batch->ptr += 4;
|
||||||
|
used = batch->ptr - batch->map;
|
||||||
|
|
||||||
|
drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer);
|
||||||
|
|
||||||
|
batch->map = NULL;
|
||||||
|
batch->ptr = NULL;
|
||||||
|
|
||||||
|
ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
|
||||||
|
assert(ret == 0);
|
||||||
|
|
||||||
|
intel_batchbuffer_reset(batch);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This is the only way buffers get added to the validate list.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch,
|
||||||
|
drm_intel_bo *buffer, uint32_t delta,
|
||||||
|
uint32_t read_domains, uint32_t write_domain)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (batch->ptr - batch->map > batch->bo->size)
|
||||||
|
printf("bad relocation ptr %p map %p offset %d size %ld\n",
|
||||||
|
batch->ptr, batch->map, batch->ptr - batch->map,
|
||||||
|
batch->bo->size);
|
||||||
|
|
||||||
|
ret = drm_intel_bo_emit_reloc(batch->bo, batch->ptr - batch->map,
|
||||||
|
buffer, delta,
|
||||||
|
read_domains, write_domain);
|
||||||
|
intel_batchbuffer_emit_dword(batch, buffer->offset + delta);
|
||||||
|
assert(ret == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_batchbuffer_data(struct intel_batchbuffer *batch,
|
||||||
|
const void *data, unsigned int bytes)
|
||||||
|
{
|
||||||
|
assert((bytes & 3) == 0);
|
||||||
|
intel_batchbuffer_require_space(batch, bytes);
|
||||||
|
memcpy(batch->ptr, data, bytes);
|
||||||
|
batch->ptr += bytes;
|
||||||
|
}
|
117
lib/intel_batchbuffer.h
Normal file
117
lib/intel_batchbuffer.h
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
#ifndef INTEL_BATCHBUFFER_H
|
||||||
|
#define INTEL_BATCHBUFFER_H
|
||||||
|
|
||||||
|
#include "intel_bufmgr.h"
|
||||||
|
#include "i810_reg.h"
|
||||||
|
|
||||||
|
#define BATCH_SZ 4096
|
||||||
|
#define BATCH_RESERVED 16
|
||||||
|
|
||||||
|
struct intel_batchbuffer
|
||||||
|
{
|
||||||
|
drm_intel_bufmgr *bufmgr;
|
||||||
|
|
||||||
|
drm_intel_bo *bo;
|
||||||
|
|
||||||
|
uint8_t *buffer;
|
||||||
|
|
||||||
|
uint8_t *map;
|
||||||
|
uint8_t *ptr;
|
||||||
|
|
||||||
|
/* debug stuff */
|
||||||
|
struct {
|
||||||
|
uint8_t *start_ptr;
|
||||||
|
unsigned int total;
|
||||||
|
} emit;
|
||||||
|
|
||||||
|
unsigned int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct intel_batchbuffer *intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr);
|
||||||
|
|
||||||
|
void intel_batchbuffer_free(struct intel_batchbuffer *batch);
|
||||||
|
|
||||||
|
|
||||||
|
void intel_batchbuffer_flush(struct intel_batchbuffer *batch);
|
||||||
|
|
||||||
|
void intel_batchbuffer_reset(struct intel_batchbuffer *batch);
|
||||||
|
|
||||||
|
void intel_batchbuffer_data(struct intel_batchbuffer *batch,
|
||||||
|
const void *data, unsigned int bytes);
|
||||||
|
|
||||||
|
void intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch,
|
||||||
|
drm_intel_bo *buffer,
|
||||||
|
uint32_t delta,
|
||||||
|
uint32_t read_domains,
|
||||||
|
uint32_t write_domain);
|
||||||
|
|
||||||
|
/* Inline functions - might actually be better off with these
|
||||||
|
* non-inlined. Certainly better off switching all command packets to
|
||||||
|
* be passed as structs rather than dwords, but that's a little bit of
|
||||||
|
* work...
|
||||||
|
*/
|
||||||
|
static inline int
|
||||||
|
intel_batchbuffer_space(struct intel_batchbuffer *batch)
|
||||||
|
{
|
||||||
|
return (batch->size - BATCH_RESERVED) - (batch->ptr - batch->map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
intel_batchbuffer_emit_dword(struct intel_batchbuffer *batch, uint32_t dword)
|
||||||
|
{
|
||||||
|
assert(batch->map);
|
||||||
|
assert(intel_batchbuffer_space(batch) >= 4);
|
||||||
|
*(uint32_t *) (batch->ptr) = dword;
|
||||||
|
batch->ptr += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
intel_batchbuffer_require_space(struct intel_batchbuffer *batch,
|
||||||
|
unsigned int sz)
|
||||||
|
{
|
||||||
|
assert(sz < batch->size - 8);
|
||||||
|
if (intel_batchbuffer_space(batch) < sz)
|
||||||
|
intel_batchbuffer_flush(batch);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here are the crusty old macros, to be removed:
|
||||||
|
*/
|
||||||
|
#define BATCH_LOCALS
|
||||||
|
|
||||||
|
#define BEGIN_BATCH(n) do { \
|
||||||
|
intel_batchbuffer_require_space(batch, (n)*4); \
|
||||||
|
assert(batch->emit.start_ptr == NULL); \
|
||||||
|
batch->emit.total = (n) * 4; \
|
||||||
|
batch->emit.start_ptr = batch->ptr; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define OUT_BATCH(d) intel_batchbuffer_emit_dword(batch, d)
|
||||||
|
|
||||||
|
#define OUT_RELOC(buf, read_domains, write_domain, delta) do { \
|
||||||
|
assert((delta) >= 0); \
|
||||||
|
intel_batchbuffer_emit_reloc(batch, buf, delta, \
|
||||||
|
read_domains, write_domain); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define ADVANCE_BATCH() do { \
|
||||||
|
unsigned int _n = batch->ptr - batch->emit.start_ptr; \
|
||||||
|
assert(batch->emit.start_ptr != NULL); \
|
||||||
|
if (_n != batch->emit.total) { \
|
||||||
|
fprintf(stderr, \
|
||||||
|
"ADVANCE_BATCH: %d of %d dwords emitted\n", \
|
||||||
|
_n, batch->emit.total); \
|
||||||
|
abort(); \
|
||||||
|
} \
|
||||||
|
batch->emit.start_ptr = NULL; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
intel_batchbuffer_emit_mi_flush(struct intel_batchbuffer *batch)
|
||||||
|
{
|
||||||
|
intel_batchbuffer_require_space(batch, 4);
|
||||||
|
intel_batchbuffer_emit_dword(batch, MI_FLUSH);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
178
m4/dolt.m4
Normal file
178
m4/dolt.m4
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
dnl dolt, a replacement for libtool
|
||||||
|
dnl Copyright © 2007-2008 Josh Triplett <josh@freedesktop.org>
|
||||||
|
dnl Copying and distribution of this file, with or without modification,
|
||||||
|
dnl are permitted in any medium without royalty provided the copyright
|
||||||
|
dnl notice and this notice are preserved.
|
||||||
|
dnl
|
||||||
|
dnl To use dolt, invoke the DOLT macro immediately after the libtool macros.
|
||||||
|
dnl Optionally, copy this file into acinclude.m4, to avoid the need to have it
|
||||||
|
dnl installed when running autoconf on your project.
|
||||||
|
|
||||||
|
AC_DEFUN([DOLT], [
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
# dolt, a replacement for libtool
|
||||||
|
# Josh Triplett <josh@freedesktop.org>
|
||||||
|
AC_PATH_PROG(DOLT_BASH, bash)
|
||||||
|
AC_MSG_CHECKING([if dolt supports this host])
|
||||||
|
dolt_supported=yes
|
||||||
|
if test x$DOLT_BASH = x; then
|
||||||
|
dolt_supported=no
|
||||||
|
fi
|
||||||
|
if test x$GCC != xyes; then
|
||||||
|
dolt_supported=no
|
||||||
|
fi
|
||||||
|
case $host in
|
||||||
|
i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux* \
|
||||||
|
|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*)
|
||||||
|
pic_options='-fPIC'
|
||||||
|
;;
|
||||||
|
i?86-apple-darwin*)
|
||||||
|
pic_options='-fno-common'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
dolt_supported=no
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if test x$dolt_supported = xno ; then
|
||||||
|
AC_MSG_RESULT([no, falling back to libtool])
|
||||||
|
LTCOMPILE='$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(COMPILE)'
|
||||||
|
LTCXXCOMPILE='$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXXCOMPILE)'
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([yes, replacing libtool])
|
||||||
|
|
||||||
|
dnl Start writing out doltcompile.
|
||||||
|
cat <<__DOLTCOMPILE__EOF__ >doltcompile
|
||||||
|
#!$DOLT_BASH
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
args=("$[]@")
|
||||||
|
for ((arg=0; arg<${#args@<:@@@:>@}; arg++)) ; do
|
||||||
|
if test x"${args@<:@$arg@:>@}" = x-o ; then
|
||||||
|
objarg=$((arg+1))
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test x$objarg = x ; then
|
||||||
|
echo 'Error: no -o on compiler command line' 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
lo="${args@<:@$objarg@:>@}"
|
||||||
|
obj="${lo%.lo}"
|
||||||
|
if test x"$lo" = x"$obj" ; then
|
||||||
|
echo "Error: libtool object file name \"$lo\" does not end in .lo" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
objbase="${obj##*/}"
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
|
||||||
|
dnl Write out shared compilation code.
|
||||||
|
if test x$enable_shared = xyes; then
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
libobjdir="${obj%$objbase}.libs"
|
||||||
|
if test ! -d "$libobjdir" ; then
|
||||||
|
mkdir_out="$(mkdir "$libobjdir" 2>&1)"
|
||||||
|
mkdir_ret=$?
|
||||||
|
if test "$mkdir_ret" -ne 0 && test ! -d "$libobjdir" ; then
|
||||||
|
echo "$mkdir_out" 1>&2
|
||||||
|
exit $mkdir_ret
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
pic_object="$libobjdir/$objbase.o"
|
||||||
|
args@<:@$objarg@:>@="$pic_object"
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
cat <<__DOLTCOMPILE__EOF__ >>doltcompile
|
||||||
|
"\${args@<:@@@:>@}" $pic_options -DPIC || exit \$?
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Write out static compilation code.
|
||||||
|
dnl Avoid duplicate compiler output if also building shared objects.
|
||||||
|
if test x$enable_static = xyes; then
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
non_pic_object="$obj.o"
|
||||||
|
args@<:@$objarg@:>@="$non_pic_object"
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
if test x$enable_shared = xyes; then
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
"${args@<:@@@:>@}" >/dev/null 2>&1 || exit $?
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
else
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
"${args@<:@@@:>@}" || exit $?
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Write out the code to write the .lo file.
|
||||||
|
dnl The second line of the .lo file must match "^# Generated by .*libtool"
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
{
|
||||||
|
echo "# $lo - a libtool object file"
|
||||||
|
echo "# Generated by doltcompile, not libtool"
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
|
||||||
|
if test x$enable_shared = xyes; then
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
echo "pic_object='.libs/${objbase}.o'"
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
else
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
echo pic_object=none
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$enable_static = xyes; then
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
echo "non_pic_object='${objbase}.o'"
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
else
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
echo non_pic_object=none
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
|
||||||
|
} > "$lo"
|
||||||
|
__DOLTCOMPILE__EOF__
|
||||||
|
|
||||||
|
dnl Done writing out doltcompile; substitute it for libtool compilation.
|
||||||
|
chmod +x doltcompile
|
||||||
|
LTCOMPILE='$(top_builddir)/doltcompile $(COMPILE)'
|
||||||
|
LTCXXCOMPILE='$(top_builddir)/doltcompile $(CXXCOMPILE)'
|
||||||
|
|
||||||
|
dnl automake ignores LTCOMPILE and LTCXXCOMPILE when it has separate CFLAGS for
|
||||||
|
dnl a target, so write out a libtool wrapper to handle that case.
|
||||||
|
dnl Note that doltlibtool does not handle inferred tags or option arguments
|
||||||
|
dnl without '=', because automake does not use them.
|
||||||
|
cat <<__DOLTLIBTOOL__EOF__ > doltlibtool
|
||||||
|
#!$DOLT_BASH
|
||||||
|
__DOLTLIBTOOL__EOF__
|
||||||
|
cat <<'__DOLTLIBTOOL__EOF__' >>doltlibtool
|
||||||
|
top_builddir_slash="${0%%doltlibtool}"
|
||||||
|
: ${top_builddir_slash:=./}
|
||||||
|
args=()
|
||||||
|
modeok=false
|
||||||
|
tagok=false
|
||||||
|
for arg in "$[]@"; do
|
||||||
|
case "$arg" in
|
||||||
|
--silent) ;;
|
||||||
|
--mode=compile) modeok=true ;;
|
||||||
|
--tag=CC|--tag=CXX) tagok=true ;;
|
||||||
|
*) args@<:@${#args[@]}@:>@="$arg" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
if $modeok && $tagok ; then
|
||||||
|
. ${top_builddir_slash}doltcompile "${args@<:@@@:>@}"
|
||||||
|
else
|
||||||
|
exec ${top_builddir_slash}libtool "$[]@"
|
||||||
|
fi
|
||||||
|
__DOLTLIBTOOL__EOF__
|
||||||
|
|
||||||
|
dnl Done writing out doltlibtool; substitute it for libtool.
|
||||||
|
chmod +x doltlibtool
|
||||||
|
LIBTOOL='$(top_builddir)/doltlibtool'
|
||||||
|
fi
|
||||||
|
AC_SUBST(LTCOMPILE)
|
||||||
|
AC_SUBST(LTCXXCOMPILE)
|
||||||
|
# end dolt
|
||||||
|
])
|
73
m4/shave.m4
Normal file
73
m4/shave.m4
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
dnl Make automake/libtool output more friendly to humans
|
||||||
|
dnl
|
||||||
|
dnl SHAVE_INIT([shavedir],[default_mode])
|
||||||
|
dnl
|
||||||
|
dnl shavedir: the directory where the shave scripts are, it defaults to
|
||||||
|
dnl $(top_builddir)
|
||||||
|
dnl default_mode: (enable|disable) default shave mode. This parameter
|
||||||
|
dnl controls shave's behaviour when no option has been
|
||||||
|
dnl given to configure. It defaults to disable.
|
||||||
|
dnl
|
||||||
|
dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just
|
||||||
|
dnl before AC_CONFIG_FILE/AC_OUTPUT is perfect. This macro rewrites CC and
|
||||||
|
dnl LIBTOOL, you don't want the configure tests to have these variables
|
||||||
|
dnl re-defined.
|
||||||
|
dnl * This macro requires GNU make's -s option.
|
||||||
|
|
||||||
|
AC_DEFUN([_SHAVE_ARG_ENABLE],
|
||||||
|
[
|
||||||
|
AC_ARG_ENABLE([shave],
|
||||||
|
AS_HELP_STRING(
|
||||||
|
[--enable-shave],
|
||||||
|
[use shave to make the build pretty [[default=$1]]]),,
|
||||||
|
[enable_shave=$1]
|
||||||
|
)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([SHAVE_INIT],
|
||||||
|
[
|
||||||
|
dnl you can tweak the default value of enable_shave
|
||||||
|
m4_if([$2], [enable], [_SHAVE_ARG_ENABLE(yes)], [_SHAVE_ARG_ENABLE(no)])
|
||||||
|
|
||||||
|
if test x"$enable_shave" = xyes; then
|
||||||
|
dnl where can we find the shave scripts?
|
||||||
|
m4_if([$1],,
|
||||||
|
[shavedir="$ac_pwd"],
|
||||||
|
[shavedir="$ac_pwd/$1"])
|
||||||
|
AC_SUBST(shavedir)
|
||||||
|
|
||||||
|
dnl make is now quiet
|
||||||
|
AC_SUBST([MAKEFLAGS], [-s])
|
||||||
|
AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`'])
|
||||||
|
|
||||||
|
dnl we need sed
|
||||||
|
AC_CHECK_PROG(SED,sed,sed,false)
|
||||||
|
|
||||||
|
dnl substitute libtool
|
||||||
|
SHAVE_SAVED_LIBTOOL=$LIBTOOL
|
||||||
|
LIBTOOL="${SHELL} ${shavedir}/shave-libtool '${SHAVE_SAVED_LIBTOOL}'"
|
||||||
|
AC_SUBST(LIBTOOL)
|
||||||
|
|
||||||
|
dnl substitute cc/cxx
|
||||||
|
SHAVE_SAVED_CC=$CC
|
||||||
|
SHAVE_SAVED_CXX=$CXX
|
||||||
|
SHAVE_SAVED_FC=$FC
|
||||||
|
SHAVE_SAVED_F77=$F77
|
||||||
|
CC="${SHELL} ${shavedir}/shave cc ${SHAVE_SAVED_CC}"
|
||||||
|
CXX="${SHELL} ${shavedir}/shave cxx ${SHAVE_SAVED_CXX}"
|
||||||
|
FC="${SHELL} ${shavedir}/shave fc ${SHAVE_SAVED_FC}"
|
||||||
|
F77="${SHELL} ${shavedir}/shave f77 ${SHAVE_SAVED_F77}"
|
||||||
|
AC_SUBST(CC)
|
||||||
|
AC_SUBST(CXX)
|
||||||
|
AC_SUBST(FC)
|
||||||
|
AC_SUBST(F77)
|
||||||
|
|
||||||
|
V=@
|
||||||
|
else
|
||||||
|
V=1
|
||||||
|
fi
|
||||||
|
Q='$(V:1=)'
|
||||||
|
AC_SUBST(V)
|
||||||
|
AC_SUBST(Q)
|
||||||
|
])
|
||||||
|
|
69
shave-libtool.in
Normal file
69
shave-libtool.in
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# we need sed
|
||||||
|
SED=@SED@
|
||||||
|
if test -z "$SED" ; then
|
||||||
|
SED=sed
|
||||||
|
fi
|
||||||
|
|
||||||
|
lt_unmangle ()
|
||||||
|
{
|
||||||
|
last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
|
||||||
|
}
|
||||||
|
|
||||||
|
# the real libtool to use
|
||||||
|
LIBTOOL="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
# if 1, don't print anything, the underlaying wrapper will do it
|
||||||
|
pass_though=0
|
||||||
|
|
||||||
|
# scan the arguments, keep the right ones for libtool, and discover the mode
|
||||||
|
preserved_args=
|
||||||
|
while test "$#" -gt 0; do
|
||||||
|
opt="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
case $opt in
|
||||||
|
--mode=*)
|
||||||
|
mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
|
||||||
|
preserved_args="$preserved_args $opt"
|
||||||
|
;;
|
||||||
|
-o)
|
||||||
|
lt_output="$1"
|
||||||
|
preserved_args="$preserved_args $opt"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
preserved_args="$preserved_args $opt"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
case "$mode" in
|
||||||
|
compile)
|
||||||
|
# shave will be called and print the actual CC/CXX/LINK line
|
||||||
|
preserved_args="$preserved_args --shave-mode=$mode"
|
||||||
|
pass_though=1
|
||||||
|
;;
|
||||||
|
link)
|
||||||
|
preserved_args="$preserved_args --shave-mode=$mode"
|
||||||
|
Q=" LINK "
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# let's u
|
||||||
|
# echo "*** libtool: Unimplemented mode: $mode, fill a bug report"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
lt_unmangle "$lt_output"
|
||||||
|
output=$last_result
|
||||||
|
|
||||||
|
if test -z $V; then
|
||||||
|
if test $pass_though -eq 0; then
|
||||||
|
echo "$Q$output"
|
||||||
|
fi
|
||||||
|
$LIBTOOL --silent $preserved_args
|
||||||
|
else
|
||||||
|
echo $LIBTOOL $preserved_args
|
||||||
|
$LIBTOOL $preserved_args
|
||||||
|
fi
|
76
shave.in
Normal file
76
shave.in
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# we need sed
|
||||||
|
SED=@SED@
|
||||||
|
if test -z "$SED" ; then
|
||||||
|
SED=sed
|
||||||
|
fi
|
||||||
|
|
||||||
|
lt_unmangle ()
|
||||||
|
{
|
||||||
|
last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
|
||||||
|
}
|
||||||
|
|
||||||
|
# the tool to wrap (cc, cxx, ar, ranlib, ..)
|
||||||
|
tool="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
# the reel tool (to call)
|
||||||
|
REEL_TOOL="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
pass_through=0
|
||||||
|
preserved_args=
|
||||||
|
while test "$#" -gt 0; do
|
||||||
|
opt="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
case $opt in
|
||||||
|
--shave-mode=*)
|
||||||
|
mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
|
||||||
|
;;
|
||||||
|
-o)
|
||||||
|
lt_output="$1"
|
||||||
|
preserved_args="$preserved_args $opt"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
preserved_args="$preserved_args $opt"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# mode=link is handled in the libtool wrapper
|
||||||
|
case "$mode,$tool" in
|
||||||
|
link,*)
|
||||||
|
pass_through=1
|
||||||
|
;;
|
||||||
|
*,cxx)
|
||||||
|
Q=" CXX "
|
||||||
|
;;
|
||||||
|
*,cc)
|
||||||
|
Q=" CC "
|
||||||
|
;;
|
||||||
|
*,fc)
|
||||||
|
Q=" FC "
|
||||||
|
;;
|
||||||
|
*,f77)
|
||||||
|
Q=" F77 "
|
||||||
|
;;
|
||||||
|
*,*)
|
||||||
|
# should not happen
|
||||||
|
Q=" CC "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
lt_unmangle "$lt_output"
|
||||||
|
output=$last_result
|
||||||
|
|
||||||
|
if test -z $V; then
|
||||||
|
if test $pass_through -eq 0; then
|
||||||
|
echo "$Q$output"
|
||||||
|
fi
|
||||||
|
$REEL_TOOL $preserved_args
|
||||||
|
else
|
||||||
|
echo $REEL_TOOL $preserved_args
|
||||||
|
$REEL_TOOL $preserved_args
|
||||||
|
fi
|
23
tests/Makefile.am
Normal file
23
tests/Makefile.am
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
TESTS = auth \
|
||||||
|
openclose \
|
||||||
|
getversion \
|
||||||
|
getclient \
|
||||||
|
getstats \
|
||||||
|
lock \
|
||||||
|
setversion \
|
||||||
|
updatedraw \
|
||||||
|
gem_basic \
|
||||||
|
gem_flink \
|
||||||
|
gem_readwrite \
|
||||||
|
gem_mmap
|
||||||
|
|
||||||
|
EXTRA_LTLIBRARIES = libdrmtest.la
|
||||||
|
EXTRA_LTLIBRARIES = libdrmtest.la
|
||||||
|
libdrmtest_la_SOURCES = \
|
||||||
|
drmtest.c \
|
||||||
|
drmtest.h
|
||||||
|
libdrmtest_la_LIBADD = \
|
||||||
|
$(top_builddir)/libdrm/libdrm.la
|
||||||
|
|
||||||
|
EXTRA_PROGRAMS = $(TESTS)
|
||||||
|
CLEANFILES = $(EXTRA_PROGRAMS) $(EXTRA_LTLIBRARIES)
|
Loading…
x
Reference in New Issue
Block a user