Compare commits

..

1 Commits

Author SHA1 Message Date
Igor Gnatenko 66964d96aa update to latest master snap
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
2014-05-12 18:41:47 +04:00
23 changed files with 2698 additions and 1395 deletions

76
.gitignore vendored
View File

@ -1,8 +1,74 @@
*.jx
*.src.rpm
.build*
/mesa-*.tar.bz2
/mesa-*.tar.xz
x86_64/
results_mesa/
mesa-*/
mesa-20100208.tar.bz2
gl-manpages-1.0.1.tar.bz2
xdriinfo-1.0.3.tar.bz2
mesa-demos-20100529.tar.bz2
mesa-20100529.tar.bz2
mesa-20100612.tar.bz2
mesa-20100709.tar.bz2
mesa-20100720.tar.bz2
/mesa-20100824.tar.bz2
/mesa-20101020.tar.bz2
/mesa-20101108.tar.bz2
/mesa-20101118.tar.bz2
/mesa-20101129.tar.bz2
/mesa-20101214.tar.xz
/mesa-20101216.tar.xz
/mesa-20110107.tar.xz
/mesa-20110315.tar.xz
/mesa-20110327.tar.xz
/MesaLib-7.10.1.tar.bz2
/mesa-20110327.tar.xz
/mesa-20110330.tar.xz
/mesa-20110401.tar.xz
/mesa-20110412.tar.xz
/mesa-20110620.tar.xz
/mesa-20110730.tar.xz
/MesaLib-7.11.tar.bz2
/mesa-20111103.tar.xz
/mesa-20111114.tar.xz
/mesa-20111129.tar.xz
/mesa-20111214.tar.xz
/mesa-20120105.tar.xz
/mesa-20120126.tar.xz
/MesaLib-8.0.tar.bz2
/MesaLib-8.0.1.tar.bz2
/MesaLib-8.0.2.tar.bz2
/mesa-20120424.tar.xz
/mesa-20120603.tar.xz
/mesa-20120716.tar.xz
/mesa-20120717.tar.xz
/mesa-20120816.tar.xz
/mesa-20120827.tar.xz
/mesa-20120924.tar.xz
/glu-9.0.0.tar.bz2
/MesaLib-9.0.tar.bz2
/MesaLib-9.0.1.tar.bz2
/mesa-20130213.tar.xz
/MesaLib-9.1.tar.bz2
/MesaLib-9.1.1.tar.bz2
/mesa-20130508.tar.xz
/mesa-20130514.tar.xz
/mesa-20130528.tar.xz
/mesa-20130610.tar.xz
/mesa-20130723.tar.xz
/mesa-20130902.tar.xz
/mesa-20130919.tar.xz
/mesa-20131113.tar.xz
/mesa-20131114.tar.xz
/mesa-20131128.tar.xz
/mesa-20131206.tar.xz
/mesa-20131220.tar.xz
/mesa-20140206.tar.xz
/mesa-20140208.tar.xz
/mesa-20140222.tar.xz
/mesa-20140225.tar.xz
/mesa-20140301.tar.xz
/mesa-20140305.tar.xz
/mesa-20140419.tar.xz
/mesa-20140430.tar.xz
/mesa-20140505.tar.xz
/mesa-20140510.tar.xz
/mesa-8baed872126b331aa8d789b78986c0100c6d853a.tar.xz

View File

@ -1,37 +0,0 @@
From c9987fca1fa611e48f85644493edd8d5a30cf403 Mon Sep 17 00:00:00 2001
From: Tom Stellard <tstellar@redhat.com>
Date: Fri, 13 Dec 2019 17:42:17 +0000
Subject: [PATCH] Link with libclang-cpp
---
src/gallium/targets/opencl/meson.build | 14 +-------------
1 file changed, 1 insertion(+), 13 deletions(-)
diff --git a/src/gallium/targets/opencl/meson.build b/src/gallium/targets/opencl/meson.build
index 907cc74337d..031d35b9716 100644
--- a/src/gallium/targets/opencl/meson.build
+++ b/src/gallium/targets/opencl/meson.build
@@ -43,19 +43,7 @@ libopencl = shared_library(
dependencies : [
idep_mesautil,
dep_clock, dep_dl, dep_unwind, dep_elf,
- cpp.find_library('clangCodeGen', dirs : llvm_libdir),
- cpp.find_library('clangFrontendTool', dirs : llvm_libdir),
- cpp.find_library('clangFrontend', dirs : llvm_libdir),
- cpp.find_library('clangDriver', dirs : llvm_libdir),
- cpp.find_library('clangSerialization', dirs : llvm_libdir),
- cpp.find_library('clangParse', dirs : llvm_libdir),
- cpp.find_library('clangSema', dirs : llvm_libdir),
- cpp.find_library('clangAnalysis', dirs : llvm_libdir),
- cpp.find_library('clangAST', dirs : llvm_libdir),
- cpp.find_library('clangASTMatchers', dirs : llvm_libdir),
- cpp.find_library('clangEdit', dirs : llvm_libdir),
- cpp.find_library('clangLex', dirs : llvm_libdir),
- cpp.find_library('clangBasic', dirs : llvm_libdir),
+ cpp.find_library('clang-cpp', dirs : llvm_libdir),
],
version : '@0@.0.0'.format(opencl_version),
install : true,
--
2.20.1

View File

@ -0,0 +1,33 @@
From a499fd73461257f284bd3194f9198dc484acd373 Mon Sep 17 00:00:00 2001
From: Adam Jackson <ajax@redhat.com>
Date: Thu, 4 Apr 2013 17:16:22 -0400
Subject: [PATCH] llvmpipe: Work without sse2 if llvm is new enough
At least on llvm 3.2 this appears to work fine. Tested on an Athlon XP
2600+, which has sse and 3dnow but not sse2.
Signed-off-by: Adam Jackson <ajax@redhat.com>
---
src/gallium/drivers/llvmpipe/lp_screen.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index 6700887..ebcf680 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -485,9 +485,10 @@ llvmpipe_create_screen(struct sw_winsys *winsys)
{
struct llvmpipe_screen *screen;
-#ifdef PIPE_ARCH_X86
- /* require SSE2 due to LLVM PR6960. */
util_cpu_detect();
+
+#if defined(PIPE_ARCH_X86) && HAVE_LLVM < 0x0302
+ /* require SSE2 due to LLVM PR6960. */
if (!util_cpu_caps.has_sse2)
return NULL;
#endif
--
1.8.2

View File

@ -0,0 +1,39 @@
From dfe652d12c62c270e00f093518a05c6966661b8a Mon Sep 17 00:00:00 2001
From: Adam Jackson <ajax@redhat.com>
Date: Mon, 6 May 2013 16:04:03 -0400
Subject: [PATCH] mesa: Be less casual about texture formats in
st_finalize_texture
Commit 62452883 removed a hunk like
if (firstImageFormat != stObj->pt->format)
st_view_format = firstImageFormat;
from update_single_texture(). This broke piglit/glx-tfp on AMD Barts
(and probably others), as that hunk was compensating for the mesa and
gallium layers disagreeing about the format.
Fix this by not ignoring the alpha channel in st_finalize_texture when
considering whether two 32-bit formats are sufficiently compatible.
Signed-off-by: Adam Jackson <ajax@redhat.com>
---
src/mesa/state_tracker/st_cb_texture.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 123ed2b..0f2656c 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1567,7 +1567,7 @@ st_finalize_texture(struct gl_context *ctx,
*/
if (stObj->pt) {
if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) ||
- !st_sampler_compat_formats(stObj->pt->format, firstImageFormat) ||
+ stObj->pt->format != firstImageFormat ||
stObj->pt->last_level < stObj->lastLevel ||
stObj->pt->width0 != ptWidth ||
stObj->pt->height0 != ptHeight ||
--
1.8.2.1

View File

@ -0,0 +1,34 @@
From 1fb986f3a722e8476af90b5ab512e495f0caf10f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= <krh@bitplanet.net>
Date: Thu, 6 Mar 2014 16:58:32 -0800
Subject: [PATCH] mesa: Don't optimize out glClear() if drawbuffer size is 0x0
The driver acquires buffer lazily and may not yet have buffers for
a newly current drawable. In that case the drawable size is 0x0 but
we still need to call into the driver and make it fetch buffers and get
the drawable size.
https://bugs.freedesktop.org/show_bug.cgi?id=75797
---
src/mesa/main/clear.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c
index 077c5fc..c3f7474 100644
--- a/src/mesa/main/clear.c
+++ b/src/mesa/main/clear.c
@@ -155,11 +155,6 @@ _mesa_Clear( GLbitfield mask )
return;
}
- if (ctx->DrawBuffer->Width == 0 || ctx->DrawBuffer->Height == 0 ||
- ctx->DrawBuffer->_Xmin >= ctx->DrawBuffer->_Xmax ||
- ctx->DrawBuffer->_Ymin >= ctx->DrawBuffer->_Ymax)
- return;
-
if (ctx->RasterDiscard)
return;
--
1.8.5.3

View File

@ -0,0 +1,71 @@
From 6da9f2a229a1b519e8cd1f794d6c2a63fedfa92e Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Sun, 12 Jan 2014 02:09:16 +0400
Subject: [PATCH] opencl: use versioned .so in mesa.icd
We must have versioned library in mesa.icd, because ICD loader would
fail if the mesa-devel package wasn't installed.
Reported-by: Fabian Deutsch <fabian.deutsch@gmx.de>
Reference: https://bugs.freedesktop.org/show_bug.cgi?id=73512
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
configure.ac | 3 +++
src/gallium/targets/opencl/Makefile.am | 2 +-
src/gallium/targets/opencl/mesa.icd | 1 -
src/gallium/targets/opencl/mesa.icd.in | 1 +
4 files changed, 5 insertions(+), 2 deletions(-)
delete mode 100644 src/gallium/targets/opencl/mesa.icd
create mode 100644 src/gallium/targets/opencl/mesa.icd.in
diff --git a/configure.ac b/configure.ac
index e77ed77..e363c03 100644
--- a/configure.ac
+++ b/configure.ac
@@ -25,6 +25,8 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
dnl Set internal versions
OSMESA_VERSION=8
AC_SUBST([OSMESA_VERSION])
+OPENCL_VERSION=1
+AC_SUBST([OPENCL_VERSION])
dnl Versions for external dependencies
LIBDRM_REQUIRED=2.4.38
@@ -2084,6 +2086,7 @@ AC_CONFIG_FILES([Makefile
src/gallium/targets/egl-static/Makefile
src/gallium/targets/gbm/Makefile
src/gallium/targets/opencl/Makefile
+ src/gallium/targets/opencl/mesa.icd
src/gallium/targets/xa/Makefile
src/gallium/targets/xa/xatracker.pc
src/gallium/targets/omx-nouveau/Makefile
diff --git a/src/gallium/targets/opencl/Makefile.am b/src/gallium/targets/opencl/Makefile.am
index ba45aee..0a3d134 100644
--- a/src/gallium/targets/opencl/Makefile.am
+++ b/src/gallium/targets/opencl/Makefile.am
@@ -5,7 +5,7 @@ lib_LTLIBRARIES = lib@OPENCL_LIBNAME@.la
lib@OPENCL_LIBNAME@_la_LDFLAGS = \
$(LLVM_LDFLAGS) \
-no-undefined \
- -version-number 1:0 \
+ -version-number @OPENCL_VERSION@:0 \
-Wl,--version-script=$(top_srcdir)/src/gallium/targets/opencl/opencl.sym \
$(GC_SECTIONS) \
$(LD_NO_UNDEFINED)
diff --git a/src/gallium/targets/opencl/mesa.icd b/src/gallium/targets/opencl/mesa.icd
deleted file mode 100644
index 6a6a870..0000000
--- a/src/gallium/targets/opencl/mesa.icd
+++ /dev/null
@@ -1 +0,0 @@
-libMesaOpenCL.so
diff --git a/src/gallium/targets/opencl/mesa.icd.in b/src/gallium/targets/opencl/mesa.icd.in
new file mode 100644
index 0000000..1b77b4e
--- /dev/null
+++ b/src/gallium/targets/opencl/mesa.icd.in
@@ -0,0 +1 @@
+lib@OPENCL_LIBNAME@.so.@OPENCL_VERSION@
--
1.9.0

View File

@ -1,26 +0,0 @@
From 0ec3bdb2264b491fd3f5dc4e638b4c12611ef219 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
Date: Sun, 20 Mar 2016 13:27:45 +0100
Subject: [PATCH 3/4] evergreen big endian
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
src/gallium/drivers/r600/r600_state_common.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index cac240e..4b620a1 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -2716,7 +2716,7 @@ uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format forma
uint32_t r600_colorformat_endian_swap(uint32_t colorformat, bool do_endian_swap)
{
- if (R600_BIG_ENDIAN) {
+ if (0 && R600_BIG_ENDIAN) {
switch(colorformat) {
/* 8-bit buffers. */
case V_0280A0_COLOR_4_4:
--
2.7.4

34
make-git-snapshot.sh Executable file
View File

@ -0,0 +1,34 @@
#!/bin/sh
# Usage: ./make-git-snapshot.sh [COMMIT]
#
# to make a snapshot of the given tag/branch. Defaults to HEAD.
# Point env var REF to a local mesa repo to reduce clone time.
if [ -e /usr/bin/pxz ]; then
XZ=/usr/bin/pxz
else
XZ=/usr/bin/xz
fi
if [ -z "$1" ]; then
DIRNAME=mesa-$( date +%Y%m%d )
BRANCH=10.2
else
DIRNAME=mesa-$1
BRANCH=master
fi
echo REF ${REF:+--reference $REF}
echo DIRNAME $DIRNAME
echo HEAD ${1:-$BRANCH}
rm -rf $DIRNAME
git clone --depth 1 ${REF:+--reference $REF} --branch $BRANCH \
git://git.freedesktop.org/git/mesa/mesa $DIRNAME
GIT_DIR=$DIRNAME/.git git archive --format=tar --prefix=$DIRNAME/ ${1:-HEAD} \
| $XZ > $DIRNAME.tar.xz
# rm -rf $DIRNAME

5
make-release-tarball.sh Normal file
View File

@ -0,0 +1,5 @@
#!/bin/sh
#
# usage: make-release-tarball.sh [version]
curl -O ftp://ftp.freedesktop.org/pub/mesa/$1/MesaLib-$1.tar.bz2

View File

@ -0,0 +1,12 @@
diff -uNr mesa-20131201.orig/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp mesa-20131201/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
--- mesa-20131201.orig/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp 2013-12-01 11:29:21.000000000 +0400
+++ mesa-20131201/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp 2013-12-01 16:05:06.488417551 +0400
@@ -739,7 +739,7 @@
if (!i)
i = new_Instruction(pol.context(), op, dType);
#ifndef NDEBUG // non-conformant assert, so this is required
- assert(typeid(*i) == typeid(*this));
+ //assert(typeid(*i) == typeid(*this));
#endif
pol.set<Instruction>(this, i);

View File

@ -0,0 +1,13 @@
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index fabc52c..c276016 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -2258,7 +2258,7 @@ uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format forma
uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
{
- if (R600_BIG_ENDIAN) {
+ if (0 && R600_BIG_ENDIAN) {
switch(colorformat) {
/* 8-bit buffers. */
case V_0280A0_COLOR_4_4:

23
mesa-7.10-swrastg.patch Normal file
View File

@ -0,0 +1,23 @@
diff -up mesa-20101020/src/gallium/drivers/llvmpipe/Makefile.jx mesa-20101020/src/gallium/drivers/llvmpipe/Makefile
diff -up mesa-20101020/src/gallium/targets/dri-swrast/Makefile.jx mesa-20101020/src/gallium/targets/dri-swrast/Makefile
--- mesa-20101020/src/gallium/targets/dri-swrast/Makefile.jx 2010-10-20 15:54:57.000000000 -0400
+++ mesa-20101020/src/gallium/targets/dri-swrast/Makefile 2010-11-08 14:39:47.000000000 -0500
@@ -26,6 +26,8 @@ C_SOURCES = \
ASM_SOURCES =
+LDFLAGS += -Wl,--version-script,../version-script
+
include ../Makefile.dri
INCLUDES += \
diff -up mesa-20101020/src/gallium/targets/version-script.jx mesa-20101020/src/gallium/targets/version-script
--- mesa-20101020/src/gallium/targets/version-script.jx 2010-11-08 14:39:56.000000000 -0500
+++ mesa-20101020/src/gallium/targets/version-script 2010-11-08 14:40:36.000000000 -0500
@@ -0,0 +1,6 @@
+GALLIUM {
+ global:
+ __dri*;
+ local:
+ *;
+};

View File

@ -0,0 +1,156 @@
diff -up mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c.jx mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c
--- mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c.jx 2012-04-24 07:37:03.000000000 -0400
+++ mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c 2012-05-16 13:30:36.596312047 -0400
@@ -252,8 +252,6 @@ drisw_update_tex_buffer(struct dri_drawa
struct pipe_transfer *transfer;
char *map;
int x, y, w, h;
- int ximage_stride, line;
- int cpp = util_format_get_blocksize(res->format);
get_drawable_info(dPriv, &x, &y, &w, &h);
@@ -266,14 +264,6 @@ drisw_update_tex_buffer(struct dri_drawa
/* Copy the Drawable content to the mapped texture buffer */
get_image(dPriv, x, y, w, h, map);
- /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. */
- ximage_stride = w * cpp;
- for (line = h-1; line; --line) {
- memmove(&map[line * transfer->stride],
- &map[line * ximage_stride],
- ximage_stride);
- }
-
pipe_transfer_unmap(pipe, transfer);
pipe_transfer_destroy(pipe, transfer);
}
diff -up mesa-20120424/src/glx/drisw_glx.c.jx mesa-20120424/src/glx/drisw_glx.c
--- mesa-20120424/src/glx/drisw_glx.c.jx 2012-04-24 07:37:03.000000000 -0400
+++ mesa-20120424/src/glx/drisw_glx.c 2012-05-16 13:29:25.087965268 -0400
@@ -24,6 +24,9 @@
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
#include <X11/Xlib.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/extensions/XShm.h>
#include "glxclient.h"
#include <dlfcn.h>
#include "dri_common.h"
@@ -206,6 +209,96 @@ swrastPutImage(__DRIdrawable * draw, int
ximage->data = NULL;
}
+static int shm_error;
+
+static int
+shm_handler(Display *d, XErrorEvent *e)
+{
+ shm_error = 1;
+ return 0;
+}
+
+static int
+align(int value, int alignment)
+{
+ return (value + alignment - 1) & ~(alignment - 1);
+}
+
+/*
+ * Slight fast path. Short of changing how texture memory is allocated, we
+ * have two options for getting the pixels out. GetImage is clamped by the
+ * server's write buffer size, so you end up doing lots of relatively small
+ * requests (128k each or so), with two memcpys: down into the kernel, and
+ * then back up. ShmGetImage is one big blit into the shm segment (which
+ * could be GPU DMA, in principle) and then another one here.
+ */
+static Bool
+swrastShmGetImage(__DRIdrawable *read, char *data, struct drisw_drawable *prp)
+{
+ __GLXDRIdrawable *pread = &(prp->base);
+ Display *dpy = pread->psc->dpy;
+ XImage *ximage = prp->ximage;
+ unsigned long image_size = ximage->height * ximage->bytes_per_line;
+ Bool ret = 0;
+ XShmSegmentInfo seg = { 0, -1, (void *)-1, 0 };
+ int (*old_handler)(Display *, XErrorEvent *);
+
+ if (!XShmQueryExtension(dpy))
+ goto out;
+
+ /* image setup */
+ seg.shmid = shmget(IPC_PRIVATE, image_size, IPC_CREAT | 0777);
+ if (seg.shmid < 0)
+ goto out;
+
+ seg.shmaddr = shmat(seg.shmid, NULL, 0);
+ if (seg.shmaddr == (void *)-1)
+ goto out;
+
+ XSync(dpy, 0);
+ old_handler = XSetErrorHandler(shm_handler);
+ XShmAttach(dpy, &seg);
+ XSync(dpy, 0);
+ XSetErrorHandler(old_handler);
+ if (shm_error)
+ goto out;
+
+ ximage->data = seg.shmaddr;
+ ximage->obdata = &seg;
+ if (!XShmGetImage(dpy, pread->xDrawable, ximage, 0, 0, -1))
+ goto out;
+
+ /*
+ * ShmGetImage doesn't actually pay attention to ->bytes_per_line.
+ * We have to compensate for this somewhere since llvmpipe's natural
+ * tile width is 64. Do it here so we don't have to undo it with a
+ * bunch of memmove in the driver.
+ */
+ do {
+ int i;
+ char *src = ximage->data;
+ int dst_width = align(ximage->width * ximage->bits_per_pixel / 8, 256);
+
+ for (i = 0; i < ximage->height; i++) {
+ memcpy(data, src, ximage->bytes_per_line);
+ data += dst_width;
+ src += ximage->bytes_per_line;
+ }
+ } while (0);
+ ret = 1;
+
+out:
+ ximage->obdata = NULL;
+ ximage->data = NULL;
+ shm_error = 0;
+ XShmDetach(dpy, &seg);
+ if (seg.shmaddr != (void *)-1)
+ shmdt(seg.shmaddr);
+ if (seg.shmid > -1)
+ shmctl(seg.shmid, IPC_RMID, NULL);
+ return ret;
+}
+
static void
swrastGetImage(__DRIdrawable * read,
int x, int y, int w, int h,
@@ -220,11 +313,17 @@ swrastGetImage(__DRIdrawable * read,
readable = pread->xDrawable;
ximage = prp->ximage;
- ximage->data = data;
ximage->width = w;
ximage->height = h;
ximage->bytes_per_line = bytes_per_line(w * ximage->bits_per_pixel, 32);
+ /* XXX check dimensions, if any caller ever sub-images */
+ if (swrastShmGetImage(read, data, prp))
+ return;
+
+ /* shm failed, fall back to protocol */
+ ximage->data = data;
+
XGetSubImage(dpy, readable, x, y, w, h, ~0L, ZPixmap, ximage, 0, 0);
ximage->data = NULL;

View File

@ -0,0 +1,201 @@
diff -up Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h.jx Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h
--- Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h.jx 2012-02-14 18:44:00.000000000 -0500
+++ Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h 2012-03-23 13:11:40.785842579 -0400
@@ -43,6 +43,7 @@ struct winsys_handle
enum drm_conf {
/* How many frames to allow before throttling. Or -1 to indicate any number */
DRM_CONF_THROTTLE, /* DRM_CONF_INT. */
+ DRM_CONF_NOTFP,
DRM_CONF_MAX
};
diff -up Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c.jx Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c
--- Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c.jx 2012-02-14 18:44:00.000000000 -0500
+++ Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c 2012-03-23 13:11:40.785842579 -0400
@@ -642,6 +642,13 @@ static struct __DRIimageExtensionRec dri
* Backend function init_screen.
*/
+static const __DRIextension *dri_screen_extensions_no_tfp[] = {
+ &dri2FlushExtension.base,
+ &dri2ImageExtension.base,
+ &dri2ConfigQueryExtension.base,
+ NULL
+};
+
static const __DRIextension *dri_screen_extensions[] = {
&driTexBufferExtension.base,
&dri2FlushExtension.base,
@@ -671,6 +678,7 @@ dri2_init_screen(__DRIscreen * sPriv)
struct dri_screen *screen;
struct pipe_screen *pscreen;
const struct drm_conf_ret *throttle_ret = NULL;
+ const struct drm_conf_ret *notfp_ret = NULL;
screen = CALLOC_STRUCT(dri_screen);
if (!screen)
@@ -682,12 +690,16 @@ dri2_init_screen(__DRIscreen * sPriv)
sPriv->driverPrivate = (void *)screen;
pscreen = driver_descriptor.create_screen(screen->fd);
- if (driver_descriptor.configuration)
+ if (driver_descriptor.configuration) {
throttle_ret = driver_descriptor.configuration(DRM_CONF_THROTTLE);
+ throttle_ret = driver_descriptor.configuration(DRM_CONF_NOTFP);
+ }
if (throttle_ret && throttle_ret->val.val_int != -1) {
sPriv->extensions = dri_screen_extensions_throttle;
screen->default_throttle_frames = throttle_ret->val.val_int;
+ } else if (notfp_ret && notfp_ret->val.val_bool == 1) {
+ sPriv->extensions = dri_screen_extensions_no_tfp;
} else
sPriv->extensions = dri_screen_extensions;
diff -up Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c.jx Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c
--- Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c.jx 2012-02-14 18:44:00.000000000 -0500
+++ Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c 2012-03-23 13:14:37.824416888 -0400
@@ -3,6 +3,12 @@
#include "state_tracker/drm_driver.h"
#include "nouveau/drm/nouveau_drm_public.h"
+#include <xf86drm.h>
+#include <nouveau_drm.h>
+
+/* yes this is an ugly hack */
+static int nvfd = -1;
+
static struct pipe_screen *
create_screen(int fd)
{
@@ -12,9 +18,52 @@ create_screen(int fd)
if (!screen)
return NULL;
+ nvfd = fd;
+
screen = debug_screen_wrap(screen);
return screen;
}
-DRM_DRIVER_DESCRIPTOR("nouveau", "nouveau", create_screen, NULL)
+static const struct drm_conf_ret notfp_ret = {
+ .type = DRM_CONF_BOOL,
+ .val.val_bool = 1,
+};
+
+static const struct drm_conf_ret *drm_configuration(enum drm_conf conf)
+{
+ switch (conf) {
+ case DRM_CONF_NOTFP:
+ {
+ /* have to open-code to reuse the fd */
+ struct drm_nouveau_getparam g;
+ int vram;
+
+ g.param = NOUVEAU_GETPARAM_CHIPSET_ID;
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
+ return &notfp_ret; /* error? paranoia */
+
+ if (g.value < 0x50)
+ return NULL; /* nv50+ okay */
+
+ if (g.value & 0xf0 == 0x30)
+ return &notfp_ret; /* nv30 definitely horked */
+
+ g.param = NOUVEAU_GETPARAM_FB_SIZE;
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
+ return &notfp_ret; /* error? paranoia */
+
+ vram = g.value;
+ if ((vram >> 20) <= 64)
+ return &notfp_ret; /* let's say <64M is too little */
+
+ return NULL;
+ }
+
+ default:
+ break;
+ }
+ return NULL;
+}
+
+DRM_DRIVER_DESCRIPTOR("nouveau", "nouveau", create_screen, drm_configuration)
diff -up Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c.jx Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c
--- Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c.jx 2012-02-14 18:44:00.000000000 -0500
+++ Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c 2012-03-23 13:38:34.477024222 -0400
@@ -37,7 +37,11 @@
#include "main/renderbuffer.h"
#include "swrast/s_renderbuffer.h"
+#include <xf86drm.h>
+#include <nouveau_drm.h>
+
static const __DRIextension *nouveau_screen_extensions[];
+static const __DRIextension *nouveau_screen_extensions_notfp[];
static void
nouveau_destroy_screen(__DRIscreen *dri_screen);
@@ -86,6 +90,28 @@ nouveau_get_configs(void)
return (const __DRIconfig **)configs;
}
+static int
+shouldnt_tfp(int nvfd)
+{
+ /* have to open-code to reuse the fd */
+ struct drm_nouveau_getparam g;
+ int vram;
+
+ g.param = NOUVEAU_GETPARAM_CHIPSET_ID;
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
+ return 1; /* error? paranoia */
+
+ g.param = NOUVEAU_GETPARAM_FB_SIZE;
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
+ return 1; /* error? paranoia */
+
+ vram = g.value;
+ if ((vram >> 20) <= 64)
+ return 1; /* let's say 64M is too little */
+
+ return 0;
+}
+
static const __DRIconfig **
nouveau_init_screen2(__DRIscreen *dri_screen)
{
@@ -99,7 +125,6 @@ nouveau_init_screen2(__DRIscreen *dri_sc
return NULL;
dri_screen->driverPrivate = screen;
- dri_screen->extensions = nouveau_screen_extensions;
screen->dri_screen = dri_screen;
/* Open the DRM device. */
@@ -110,6 +135,11 @@ nouveau_init_screen2(__DRIscreen *dri_sc
goto fail;
}
+ if (shouldnt_tfp(dri_screen->fd))
+ dri_screen->extensions = nouveau_screen_extensions_notfp;
+ else
+ dri_screen->extensions = nouveau_screen_extensions;
+
/* Choose the card specific function pointers. */
switch (screen->device->chipset & 0xf0) {
case 0x00:
@@ -240,6 +270,12 @@ static const __DRIextension *nouveau_scr
&dri2ConfigQueryExtension.base,
NULL
};
+
+static const __DRIextension *nouveau_screen_extensions_notfp[] = {
+ &nouveau_flush_extension.base,
+ &dri2ConfigQueryExtension.base,
+ NULL
+};
const struct __DriverAPIRec driDriverAPI = {
.InitScreen = nouveau_init_screen2,

View File

@ -0,0 +1,13 @@
diff -up Mesa-8.0.1/src/mesa/state_tracker/st_manager.c.jx Mesa-8.0.1/src/mesa/state_tracker/st_manager.c
--- Mesa-8.0.1/src/mesa/state_tracker/st_manager.c.jx 2012-02-14 18:44:00.000000000 -0500
+++ Mesa-8.0.1/src/mesa/state_tracker/st_manager.c 2012-04-02 12:02:14.613964417 -0400
@@ -528,6 +528,9 @@ st_context_teximage(struct st_context_if
if (util_format_get_component_bits(internal_format,
UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
internalFormat = GL_RGBA;
+ else if (util_format_get_component_bits(internal_format,
+ UTIL_FORMAT_COLORSPACE_RGB, 0) == 5)
+ internalFormat = GL_RGB5;
else
internalFormat = GL_RGB;

View File

@ -0,0 +1,13 @@
diff -up Mesa-9.0.1/src/gallium/drivers/nv50/codegen/nv50_ir.cpp.jx Mesa-9.0.1/src/gallium/drivers/nv50/codegen/nv50_ir.cpp
--- Mesa-9.0.1/src/gallium/drivers/nv50/codegen/nv50_ir.cpp.jx 2012-08-31 19:33:41.000000000 -0400
+++ Mesa-9.0.1/src/gallium/drivers/nv50/codegen/nv50_ir.cpp 2012-12-20 12:58:02.115699825 -0500
@@ -715,7 +715,9 @@ Instruction::clone(ClonePolicy<Function>
{
if (!i)
i = new_Instruction(pol.context(), op, dType);
+#ifdef __GXX_RTTI
assert(typeid(*i) == typeid(*this));
+#endif
pol.set<Instruction>(this, i);

View File

@ -0,0 +1,36 @@
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index 5ec1df6..a0406fc 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -306,6 +306,13 @@ llvmpipe_is_format_supported( struct pipe_screen *_screen,
if (!format_desc)
return FALSE;
+ if ((bind & PIPE_BIND_RENDER_TARGET) &&
+ format != PIPE_FORMAT_R9G9B9E5_FLOAT &&
+ format != PIPE_FORMAT_R11G11B10_FLOAT &&
+ util_format_is_float(format)) {
+ return FALSE;
+ }
+
assert(target == PIPE_BUFFER ||
target == PIPE_TEXTURE_1D ||
target == PIPE_TEXTURE_1D_ARRAY ||
diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
index 937035e..2f5e571 100644
--- a/src/gallium/drivers/softpipe/sp_screen.c
+++ b/src/gallium/drivers/softpipe/sp_screen.c
@@ -291,6 +291,13 @@ softpipe_is_format_supported( struct pipe_screen *screen,
if (!format_desc)
return FALSE;
+ if ((bind & PIPE_BIND_RENDER_TARGET) &&
+ format != PIPE_FORMAT_R9G9B9E5_FLOAT &&
+ format != PIPE_FORMAT_R11G11B10_FLOAT &&
+ util_format_is_float(format)) {
+ return FALSE;
+ }
+
if (sample_count > 1)
return FALSE;

978
mesa-no-libkms.patch Normal file
View File

@ -0,0 +1,978 @@
diff --git a/configure.ac b/configure.ac
index 8badb72..2a3e766 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1217,8 +1217,6 @@ if test "x$enable_gbm" = xyes; then
if test "x$enable_shared_glapi" = xno; then
AC_MSG_ERROR([gbm_dri requires --enable-shared-glapi])
fi
- PKG_CHECK_MODULES([LIBKMS], [libkms], [],
- AC_MSG_ERROR([gbm needs libkms]))
fi
fi
GBM_PC_REQ_PRIV="libudev"
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 1e0f1d0..f35f857 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -923,10 +923,6 @@ struct __DRIdri2ExtensionRec {
* __DRI_IMAGE_FORMAT_NONE is for images that aren't directly usable
* by the driver (YUV planar formats) but serve as a base image for
* creating sub-images for the different planes within the image.
- *
- * R8, GR88 and NONE should not be used with createImageFormName or
- * createImage, and are returned by query from sub images created with
- * createImageFromNames (NONE, see above) and fromPlane (R8 & GR88).
*/
#define __DRI_IMAGE_FORMAT_RGB565 0x1001
#define __DRI_IMAGE_FORMAT_XRGB8888 0x1002
@@ -939,50 +935,8 @@ struct __DRIdri2ExtensionRec {
#define __DRI_IMAGE_USE_SHARE 0x0001
#define __DRI_IMAGE_USE_SCANOUT 0x0002
-#define __DRI_IMAGE_USE_CURSOR 0x0004 /* Depricated */
-
-
-/**
- * Four CC formats that matches with WL_DRM_FORMAT_* from wayland_drm.h
- * and GBM_FORMAT_* from gbm.h, used with createImageFromNames.
- *
- * \since 5
- */
-
-#define __DRI_IMAGE_FOURCC_RGB565 0x36314752
-#define __DRI_IMAGE_FOURCC_ARGB8888 0x34325241
-#define __DRI_IMAGE_FOURCC_XRGB8888 0x34325258
-#define __DRI_IMAGE_FOURCC_ABGR8888 0x34324241
-#define __DRI_IMAGE_FOURCC_XBGR8888 0x34324258
-#define __DRI_IMAGE_FOURCC_YUV410 0x39565559
-#define __DRI_IMAGE_FOURCC_YUV411 0x31315559
-#define __DRI_IMAGE_FOURCC_YUV420 0x32315559
-#define __DRI_IMAGE_FOURCC_YUV422 0x36315559
-#define __DRI_IMAGE_FOURCC_YUV444 0x34325559
-#define __DRI_IMAGE_FOURCC_NV12 0x3231564e
-#define __DRI_IMAGE_FOURCC_NV16 0x3631564e
-#define __DRI_IMAGE_FOURCC_YUYV 0x56595559
-
-
-/**
- * Queryable on images created by createImageFromNames.
- *
- * RGB and RGBA are may be usable directly as images but its still
- * recommended to call fromPlanar with plane == 0.
- *
- * Y_U_V, Y_UV and Y_XUXV all requires call to fromPlanar to create
- * usable sub-images, sampling from images return raw YUV data and
- * color conversion needs to be done in the shader.
- *
- * \since 5
- */
-
-#define __DRI_IMAGE_COMPONENTS_RGB 0x3001
-#define __DRI_IMAGE_COMPONENTS_RGBA 0x3002
-#define __DRI_IMAGE_COMPONENTS_Y_U_V 0x3003
-#define __DRI_IMAGE_COMPONENTS_Y_UV 0x3004
-#define __DRI_IMAGE_COMPONENTS_Y_XUXV 0x3005
-
+#define __DRI_IMAGE_USE_CURSOR 0x0004
+#define __DRI_IMAGE_USE_WRITE 0x0008
/**
* queryImage attributes
@@ -994,7 +948,6 @@ struct __DRIdri2ExtensionRec {
#define __DRI_IMAGE_ATTRIB_FORMAT 0x2003 /* available in versions 3+ */
#define __DRI_IMAGE_ATTRIB_WIDTH 0x2004 /* available in versions 4+ */
#define __DRI_IMAGE_ATTRIB_HEIGHT 0x2005
-#define __DRI_IMAGE_ATTRIB_COMPONENTS 0x2006 /* available in versions 5+ */
typedef struct __DRIimageRec __DRIimage;
typedef struct __DRIimageExtensionRec __DRIimageExtension;
@@ -1032,17 +985,11 @@ struct __DRIimageExtensionRec {
GLboolean (*validateUsage)(__DRIimage *image, unsigned int use);
/**
- * Unlike createImageFromName __DRI_IMAGE_FORMAT is not but instead
- * __DRI_IMAGE_FOURCC and strides are in bytes not pixels. Stride is
- * also per block and not per pixel (for non-RGB, see gallium blocks).
+ * Write data into image.
*
- * \since 5
+ * \since 4
*/
- __DRIimage *(*createImageFromNames)(__DRIscreen *screen,
- int width, int height, int fourcc,
- int *names, int num_names,
- int *strides, int *offsets,
- void *loaderPrivate);
+ int (*write)(__DRIimage *image, const void *buf, size_t count);
/**
* Create an image out of a sub-region of a parent image. This
@@ -1059,8 +1006,10 @@ struct __DRIimageExtensionRec {
*
* \since 5
*/
- __DRIimage *(*fromPlanar)(__DRIimage *image, int plane,
- void *loaderPrivate);
+ __DRIimage *(*createSubImage)(__DRIimage *image,
+ int width, int height, int format,
+ int offset, int pitch,
+ void *loaderPrivate);
};
diff --git a/src/egl/drivers/dri2/Makefile.am b/src/egl/drivers/dri2/Makefile.am
index 45f7dfa..49ec06b 100644
--- a/src/egl/drivers/dri2/Makefile.am
+++ b/src/egl/drivers/dri2/Makefile.am
@@ -30,7 +30,6 @@ AM_CFLAGS = \
$(DEFINES) \
$(LIBDRM_CFLAGS) \
$(LIBUDEV_CFLAGS) \
- $(LIBKMS_CFLAGS) \
-DDEFAULT_DRIVER_DIR=\"$(DRI_DRIVER_SEARCH_DIR)\"
noinst_LTLIBRARIES = libegl_dri2.la
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index f2cce74..7326b85 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1093,16 +1093,68 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
* wl_drm format code to a description of the planes in the buffer
* that lets us create a __DRIimage for each of the planes. */
-static const struct wl_drm_components_descriptor {
- uint32_t dri_components;
+static const struct wl_drm_format_descriptor {
+ uint32_t wl_format;
EGLint components;
int nplanes;
-} wl_drm_components[] = {
- { __DRI_IMAGE_COMPONENTS_RGB, EGL_TEXTURE_RGB, 1 },
- { __DRI_IMAGE_COMPONENTS_RGBA, EGL_TEXTURE_RGBA, 1 },
- { __DRI_IMAGE_COMPONENTS_Y_U_V, EGL_TEXTURE_Y_U_V_WL, 3 },
- { __DRI_IMAGE_COMPONENTS_Y_UV, EGL_TEXTURE_Y_UV_WL, 2 },
- { __DRI_IMAGE_COMPONENTS_Y_XUXV, EGL_TEXTURE_Y_XUXV_WL, 2 },
+ struct {
+ int buffer_index;
+ int width_shift;
+ int height_shift;
+ uint32_t dri_format;
+ int cpp;
+ } planes[3];
+} wl_drm_formats[] = {
+ { WL_DRM_FORMAT_ARGB8888, EGL_TEXTURE_RGBA, 1,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 }, } },
+
+ { WL_DRM_FORMAT_XRGB8888, EGL_TEXTURE_RGB, 1,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_XRGB8888, 4 }, } },
+
+ { WL_DRM_FORMAT_YUV410, EGL_TEXTURE_Y_U_V_WL, 3,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 1, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 2, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 } } },
+
+ { WL_DRM_FORMAT_YUV411, EGL_TEXTURE_Y_U_V_WL, 3,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 1, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 2, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
+
+ { WL_DRM_FORMAT_YUV420, EGL_TEXTURE_Y_U_V_WL, 3,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 1, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 2, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 } } },
+
+ { WL_DRM_FORMAT_YUV422, EGL_TEXTURE_Y_U_V_WL, 3,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 1, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 2, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
+
+ { WL_DRM_FORMAT_YUV444, EGL_TEXTURE_Y_U_V_WL, 3,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 1, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 2, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
+
+ { WL_DRM_FORMAT_NV12, EGL_TEXTURE_Y_UV_WL, 2,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88, 2 } } },
+
+ { WL_DRM_FORMAT_NV16, EGL_TEXTURE_Y_UV_WL, 2,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
+ { 1, 1, 0, __DRI_IMAGE_FORMAT_GR88, 2 } } },
+
+ /* For YUYV buffers, we set up two overlapping DRI images and treat
+ * them as planar buffers in the compositors. Plane 0 is GR88 and
+ * samples YU or YV pairs and places Y into the R component, while
+ * plane 1 is ARGB and samples YUYV clusters and places pairs and
+ * places U into the G component and V into A. This lets the
+ * texture sampler interpolate the Y components correctly when
+ * sampling from plane 0, and interpolate U and V correctly when
+ * sampling from plane 1. */
+ { WL_DRM_FORMAT_YUYV, EGL_TEXTURE_Y_XUXV_WL, 2,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR88, 2 },
+ { 0, 1, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } }
};
static _EGLImage *
@@ -1112,11 +1164,13 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
{
struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
- const struct wl_drm_components_descriptor *f;
__DRIimage *dri_image;
_EGLImageAttribs attrs;
EGLint err;
- int32_t plane;
+ uint32_t format;
+ int32_t offset, stride, plane, width, height;
+ int cpp, index;
+ const struct wl_drm_format_descriptor *f;
if (!wayland_buffer_is_drm(&buffer->buffer))
return NULL;
@@ -1135,12 +1189,17 @@ dri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
return NULL;
}
- dri_image = dri2_dpy->image->fromPlanar(buffer->driver_buffer, plane, NULL);
+ width = buffer->buffer.width >> f->planes[plane].width_shift;
+ height = buffer->buffer.height >> f->planes[plane].height_shift;
+ format = f->planes[plane].dri_format;
+ cpp = f->planes[plane].cpp;
+ index = f->planes[plane].buffer_index;
+ offset = buffer->offset[index];
+ stride = buffer->stride[index];
- if (dri_image == NULL) {
- _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer");
- return NULL;
- }
+ dri_image = dri2_dpy->image->createSubImage(buffer->driver_buffer,
+ width, height, format,
+ offset, stride / cpp, NULL);
return dri2_create_image(disp, dri_image);
}
@@ -1301,31 +1360,24 @@ dri2_wl_reference_buffer(void *user_data, uint32_t name,
{
_EGLDisplay *disp = user_data;
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
- __DRIimage *img;
- int i, dri_components = 0;
-
- img = dri2_dpy->image->createImageFromNames(dri2_dpy->dri_screen,
- buffer->buffer.width,
- buffer->buffer.height,
- buffer->format, (int*)&name, 1,
- buffer->stride,
- buffer->offset,
- NULL);
-
- if (img == NULL)
- return;
-
- dri2_dpy->image->queryImage(img, __DRI_IMAGE_ATTRIB_COMPONENTS, &dri_components);
+ int i;
- buffer->driver_format = NULL;
- for (i = 0; i < ARRAY_SIZE(wl_drm_components); i++)
- if (wl_drm_components[i].dri_components == dri_components)
- buffer->driver_format = &wl_drm_components[i];
+ for (i = 0; i < ARRAY_SIZE(wl_drm_formats); i++)
+ if (wl_drm_formats[i].wl_format == buffer->format) {
+ buffer->driver_format = &wl_drm_formats[i];
+ break;
+ }
if (buffer->driver_format == NULL)
- dri2_dpy->image->destroyImage(img);
- else
- buffer->driver_buffer = img;
+ return;
+
+ buffer->driver_buffer =
+ dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
+ buffer->buffer.width,
+ buffer->buffer.height,
+ __DRI_IMAGE_FORMAT_NONE, name,
+ buffer->stride[0] / 4,
+ NULL);
}
static void
@@ -1390,7 +1442,7 @@ dri2_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp,
EGLint attribute, EGLint *value)
{
struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
- const struct wl_drm_components_descriptor *format;
+ const struct wl_drm_format_descriptor *format;
if (!wayland_buffer_is_drm(&buffer->buffer))
return EGL_FALSE;
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h b/src/gallium/state_trackers/dri/common/dri_screen.h
index ff48b02..2818e9c 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.h
+++ b/src/gallium/state_trackers/dri/common/dri_screen.h
@@ -86,7 +86,6 @@ struct __DRIimageRec {
unsigned level;
unsigned layer;
uint32_t dri_format;
- uint32_t dri_components;
void *loader_private;
};
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index 2f83dab..d7f4dd6 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -574,7 +574,6 @@ dri2_create_image(__DRIscreen *_screen,
img->level = 0;
img->layer = 0;
img->dri_format = format;
- img->dri_components = 0;
img->loader_private = loaderPrivate;
return img;
@@ -613,11 +612,6 @@ dri2_query_image(__DRIimage *image, int attrib, int *value)
case __DRI_IMAGE_ATTRIB_HEIGHT:
*value = image->texture->height0;
return GL_TRUE;
- case __DRI_IMAGE_ATTRIB_COMPONENTS:
- if (image->dri_components == 0)
- return GL_FALSE;
- *value = image->dri_components;
- return GL_TRUE;
default:
return GL_FALSE;
}
@@ -636,8 +630,6 @@ dri2_dup_image(__DRIimage *image, void *loaderPrivate)
pipe_resource_reference(&img->texture, image->texture);
img->level = image->level;
img->layer = image->layer;
- /* This should be 0 for sub images, but dup is also used for base images. */
- img->dri_components = image->dri_components;
img->loader_private = loaderPrivate;
return img;
@@ -657,76 +649,6 @@ dri2_validate_usage(__DRIimage *image, unsigned int use)
return GL_FALSE;
}
-static __DRIimage *
-dri2_from_names(__DRIscreen *screen, int width, int height, int format,
- int *names, int num_names, int *strides, int *offsets,
- void *loaderPrivate)
-{
- __DRIimage *img;
- int stride, dri_components;
-
- if (num_names != 1)
- return NULL;
- if (offsets[0] != 0)
- return NULL;
-
- switch(format) {
- case __DRI_IMAGE_FOURCC_RGB565:
- format = __DRI_IMAGE_FORMAT_RGB565;
- dri_components = __DRI_IMAGE_COMPONENTS_RGB;
- break;
- case __DRI_IMAGE_FOURCC_ARGB8888:
- format = __DRI_IMAGE_FORMAT_ARGB8888;
- dri_components = __DRI_IMAGE_COMPONENTS_RGBA;
- break;
- case __DRI_IMAGE_FOURCC_XRGB8888:
- format = __DRI_IMAGE_FORMAT_XRGB8888;
- dri_components = __DRI_IMAGE_COMPONENTS_RGB;
- break;
- case __DRI_IMAGE_FOURCC_ABGR8888:
- format = __DRI_IMAGE_FORMAT_ABGR8888;
- dri_components = __DRI_IMAGE_COMPONENTS_RGBA;
- break;
- case __DRI_IMAGE_FOURCC_XBGR8888:
- format = __DRI_IMAGE_FORMAT_XBGR8888;
- dri_components = __DRI_IMAGE_COMPONENTS_RGB;
- break;
- default:
- return NULL;
- }
-
- /* Strides are in bytes not pixels. */
- stride = strides[0] /4;
-
- img = dri2_create_image_from_name(screen, width, height, format,
- names[0], stride, loaderPrivate);
- if (img == NULL)
- return NULL;
-
- img->dri_components = dri_components;
- return img;
-}
-
-static __DRIimage *
-dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
-{
- __DRIimage *img;
-
- if (plane != 0)
- return NULL;
-
- if (image->dri_components == 0)
- return NULL;
-
- img = dri2_dup_image(image, loaderPrivate);
- if (img == NULL)
- return NULL;
-
- /* set this to 0 for sub images. */
- img->dri_components = 0;
- return img;
-}
-
static void
dri2_destroy_image(__DRIimage *img)
{
@@ -735,7 +657,7 @@ dri2_destroy_image(__DRIimage *img)
}
static struct __DRIimageExtensionRec dri2ImageExtension = {
- { __DRI_IMAGE, 5 },
+ { __DRI_IMAGE, 4 },
dri2_create_image_from_name,
dri2_create_image_from_renderbuffer,
dri2_destroy_image,
@@ -743,8 +665,6 @@ static struct __DRIimageExtensionRec dri2ImageExtension = {
dri2_query_image,
dri2_dup_image,
dri2_validate_usage,
- dri2_from_names,
- dri2_from_planar,
};
/*
diff --git a/src/gbm/Makefile.am b/src/gbm/Makefile.am
index e22c55c..f079da1 100644
--- a/src/gbm/Makefile.am
+++ b/src/gbm/Makefile.am
@@ -7,7 +7,6 @@ AM_CFLAGS = \
-I$(top_srcdir)/include \
-I$(top_srcdir)/src/gbm/main \
$(LIBUDEV_CFLAGS) \
- $(LIBKMS_CFLAGS) \
$(DLOPEN_CFLAGS) \
$(DEFINES)
@@ -19,7 +18,7 @@ libgbm_la_SOURCES = \
main/backend.c \
main/common.c
libgbm_la_LDFLAGS = -version-info 1:0
-libgbm_la_LIBADD = $(LIBUDEV_LIBS) $(LIBKMS_LIBS) $(DLOPEN_LIBS)
+libgbm_la_LIBADD = $(LIBUDEV_LIBS) $(DLOPEN_LIBS)
if HAVE_EGL_PLATFORM_WAYLAND
AM_CPPFLAGS = -DHAVE_WAYLAND_PLATFORM
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index d8b1cc7..173e727 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -299,21 +299,13 @@ gbm_dri_is_format_supported(struct gbm_device *gbm,
static int
gbm_dri_bo_write(struct gbm_bo *_bo, const void *buf, size_t count)
{
+ struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
- void *ptr;
- int ret;
- if (bo->bo == NULL)
- return -1;
-
- ret = kms_bo_map(bo->bo, &ptr);
- if (ret < 0)
+ if (dri->image->base.version < 4)
return -1;
- memcpy(ptr, buf, count);
-
- kms_bo_unmap(bo->bo);
- return 0;
+ return dri->image->write(bo->image, buf, count);
}
static void
@@ -322,10 +314,7 @@ gbm_dri_bo_destroy(struct gbm_bo *_bo)
struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
- if (bo->image != NULL)
- dri->image->destroyImage(bo->image);
- if (bo->bo != NULL)
- kms_bo_destroy(&bo->bo);
+ dri->image->destroyImage(bo->image);
free(bo);
}
@@ -363,7 +352,7 @@ gbm_dri_bo_import(struct gbm_device *gbm,
struct gbm_dri_bo *bo;
__DRIimage *image;
unsigned dri_use = 0;
- int gbm_format;
+ int dri_format, width, height, gbm_format, stride, cpp, offset;
/* Required for query image WIDTH & HEIGHT */
if (dri->image->base.version < 4)
@@ -376,15 +365,20 @@ gbm_dri_bo_import(struct gbm_device *gbm,
struct wl_drm_buffer *wb = (struct wl_drm_buffer *) buffer;
image = wb->driver_buffer;
-
+ stride = wb->stride[0];
+ offset = wb->offset[0];
+ cpp = 4;
switch (wb->format) {
case WL_DRM_FORMAT_XRGB8888:
+ dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
gbm_format = GBM_FORMAT_XRGB8888;
break;
case WL_DRM_FORMAT_ARGB8888:
+ dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
gbm_format = GBM_FORMAT_ARGB8888;
break;
case WL_DRM_FORMAT_YUYV:
+ dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
gbm_format = GBM_FORMAT_YUYV;
break;
default:
@@ -396,15 +390,15 @@ gbm_dri_bo_import(struct gbm_device *gbm,
case GBM_BO_IMPORT_EGL_IMAGE:
{
- int dri_format;
if (dri->lookup_image == NULL)
return NULL;
image = dri->lookup_image(dri->screen, buffer, dri->lookup_user_data);
dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &dri_format);
gbm_format = gbm_dri_to_gbm_format(dri_format);
- if (gbm_format == 0)
- return NULL;
+ dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
+ offset = 0;
+ cpp = 4;
break;
}
@@ -417,7 +411,13 @@ gbm_dri_bo_import(struct gbm_device *gbm,
if (bo == NULL)
return NULL;
- bo->image = dri->image->dupImage(image, NULL);
+ dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width);
+ dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT, &height);
+
+ bo->image = dri->image->createSubImage(image,
+ width, height, dri_format,
+ offset, stride / cpp, NULL);
+
if (usage & GBM_BO_USE_SCANOUT)
dri_use |= __DRI_IMAGE_USE_SCANOUT;
@@ -430,14 +430,10 @@ gbm_dri_bo_import(struct gbm_device *gbm,
}
bo->base.base.gbm = gbm;
+ bo->base.base.width = width;
+ bo->base.base.height = height;
+ bo->base.base.stride = stride;
bo->base.base.format = gbm_format;
-
- dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_WIDTH,
- (int*)&bo->base.base.width);
- dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HEIGHT,
- (int*)&bo->base.base.height);
- dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE,
- (int*)&bo->base.base.stride);
dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE,
&bo->base.base.handle.s32);
@@ -454,6 +450,9 @@ gbm_dri_bo_create(struct gbm_device *gbm,
int dri_format;
unsigned dri_use = 0;
+ if (dri->image->base.version < 4 && (usage & GBM_BO_USE_WRITE))
+ return NULL;
+
bo = calloc(1, sizeof *bo);
if (bo == NULL)
return NULL;
@@ -462,33 +461,6 @@ gbm_dri_bo_create(struct gbm_device *gbm,
bo->base.base.width = width;
bo->base.base.height = height;
- if (usage & GBM_BO_USE_WRITE) {
- int ret;
- unsigned attrs[7] = {
- KMS_WIDTH, 64,
- KMS_HEIGHT, 64,
- KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
- KMS_TERMINATE_PROP_LIST,
- };
-
- if (!(usage & GBM_BO_USE_CURSOR_64X64))
- return NULL;
-
- if (dri->kms == NULL)
- return NULL;
-
- ret = kms_bo_create(dri->kms, attrs, &bo->bo);
- if (ret < 0) {
- free(bo);
- return NULL;
- }
-
- kms_bo_get_prop(bo->bo, KMS_PITCH, &bo->base.base.stride);
- kms_bo_get_prop(bo->bo, KMS_HANDLE, (unsigned*)&bo->base.base.handle);
-
- return &bo->base.base;
- }
-
switch (format) {
case GBM_FORMAT_RGB565:
dri_format =__DRI_IMAGE_FORMAT_RGB565;
@@ -512,6 +484,8 @@ gbm_dri_bo_create(struct gbm_device *gbm,
dri_use |= __DRI_IMAGE_USE_SCANOUT;
if (usage & GBM_BO_USE_CURSOR_64X64)
dri_use |= __DRI_IMAGE_USE_CURSOR;
+ if (usage & GBM_BO_USE_WRITE)
+ dri_use |= __DRI_IMAGE_USE_WRITE;
/* Gallium drivers requires shared in order to get the handle/stride */
dri_use |= __DRI_IMAGE_USE_SHARE;
@@ -594,21 +568,13 @@ dri_device_create(int fd)
dri->base.type = GBM_DRM_DRIVER_TYPE_DRI;
dri->base.base.name = "drm";
- kms_create(fd, &dri->kms);
- if (dri->kms == NULL)
- goto err_kms;
-
ret = dri_screen_create(dri);
- if (ret)
- goto err_dri;
+ if (ret) {
+ free(dri);
+ return NULL;
+ }
return &dri->base.base;
-
-err_dri:
- kms_destroy(&dri->kms);
-err_kms:
- free(dri);
- return NULL;
}
struct gbm_backend gbm_dri_backend = {
diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h
index 4b619a0..f404368 100644
--- a/src/gbm/backends/dri/gbm_driint.h
+++ b/src/gbm/backends/dri/gbm_driint.h
@@ -30,8 +30,6 @@
#include "gbmint.h"
-#include "libkms.h"
-
#include "common.h"
#include "common_drm.h"
@@ -43,9 +41,6 @@ struct gbm_dri_surface;
struct gbm_dri_device {
struct gbm_drm_device base;
- /* Only used for cursors */
- struct kms_driver *kms;
-
void *driver;
__DRIscreen *screen;
@@ -77,9 +72,6 @@ struct gbm_dri_bo {
struct gbm_drm_bo base;
__DRIimage *image;
-
- /* Only used for cursors */
- struct kms_bo *bo;
};
struct gbm_dri_surface {
diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h
index 7480853..782d669 100644
--- a/src/mesa/drivers/dri/intel/intel_regions.h
+++ b/src/mesa/drivers/dri/intel/intel_regions.h
@@ -141,38 +141,13 @@ uint32_t
intel_region_get_aligned_offset(struct intel_region *region, uint32_t x,
uint32_t y);
-/**
- * Used with images created with image_from_names
- * to help support planar images.
- */
-struct intel_image_format {
- int fourcc;
- int components;
- int nplanes;
- struct {
- int buffer_index;
- int width_shift;
- int height_shift;
- uint32_t dri_format;
- int cpp;
- } planes[3];
-};
-
struct __DRIimageRec {
struct intel_region *region;
GLenum internal_format;
+ uint32_t usage;
uint32_t dri_format;
GLuint format;
uint32_t offset;
-
- /*
- * Need to save these here between calls to
- * image_from_names and calls to image_from_planar.
- */
- uint32_t strides[3];
- uint32_t offsets[3];
- struct intel_image_format *planar_format;
-
void *data;
};
diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
index 7476ca0..b245314 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -190,59 +190,6 @@ static const struct __DRI2flushExtensionRec intelFlushExtension = {
dri2InvalidateDrawable,
};
-struct intel_image_format intel_image_formats[] = {
- { __DRI_IMAGE_FOURCC_ARGB8888, __DRI_IMAGE_COMPONENTS_RGBA, 1,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } },
-
- { __DRI_IMAGE_FOURCC_XRGB8888, __DRI_IMAGE_COMPONENTS_RGB, 1,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_XRGB8888, 4 }, } },
-
- { __DRI_IMAGE_FOURCC_YUV410, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 1, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 },
- { 2, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 } } },
-
- { __DRI_IMAGE_FOURCC_YUV411, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 1, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 2, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
-
- { __DRI_IMAGE_FOURCC_YUV420, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 1, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 },
- { 2, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 } } },
-
- { __DRI_IMAGE_FOURCC_YUV422, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 1, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 2, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
-
- { __DRI_IMAGE_FOURCC_YUV444, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 1, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 2, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
-
- { __DRI_IMAGE_FOURCC_NV12, __DRI_IMAGE_COMPONENTS_Y_UV, 2,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88, 2 } } },
-
- { __DRI_IMAGE_FOURCC_NV16, __DRI_IMAGE_COMPONENTS_Y_UV, 2,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
- { 1, 1, 0, __DRI_IMAGE_FORMAT_GR88, 2 } } },
-
- /* For YUYV buffers, we set up two overlapping DRI images and treat
- * them as planar buffers in the compositors. Plane 0 is GR88 and
- * samples YU or YV pairs and places Y into the R component, while
- * plane 1 is ARGB and samples YUYV clusters and places pairs and
- * places U into the G component and V into A. This lets the
- * texture sampler interpolate the Y components correctly when
- * sampling from plane 0, and interpolate U and V correctly when
- * sampling from plane 1. */
- { __DRI_IMAGE_FOURCC_YUYV, __DRI_IMAGE_COMPONENTS_Y_XUXV, 2,
- { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR88, 2 },
- { 0, 1, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } }
-};
-
static __DRIimage *
intel_allocate_image(int dri_format, void *loaderPrivate)
{
@@ -302,7 +249,7 @@ intel_create_image_from_name(__DRIscreen *screen,
image = intel_allocate_image(format, loaderPrivate);
if (image->format == MESA_FORMAT_NONE)
- cpp = 1;
+ cpp = 0;
else
cpp = _mesa_get_format_bytes(image->format);
image->region = intel_region_alloc_for_handle(intelScreen,
@@ -392,7 +339,13 @@ intel_create_image(__DRIscreen *screen,
tiling = I915_TILING_NONE;
}
+ /* We only support write for cursor drm images */
+ if ((use & __DRI_IMAGE_USE_WRITE) &&
+ use != (__DRI_IMAGE_USE_WRITE | __DRI_IMAGE_USE_CURSOR))
+ return NULL;
+
image = intel_allocate_image(format, loaderPrivate);
+ image->usage = use;
cpp = _mesa_get_format_bytes(image->format);
image->region =
intel_region_alloc(intelScreen, tiling, cpp, width, height, true);
@@ -425,11 +378,6 @@ intel_query_image(__DRIimage *image, int attrib, int *value)
case __DRI_IMAGE_ATTRIB_HEIGHT:
*value = image->region->height;
return true;
- case __DRI_IMAGE_ATTRIB_COMPONENTS:
- if (image->planar_format == NULL)
- return false;
- *value = image->planar_format->components;
- return true;
default:
return false;
}
@@ -451,15 +399,12 @@ intel_dup_image(__DRIimage *orig_image, void *loaderPrivate)
}
image->internal_format = orig_image->internal_format;
- image->planar_format = orig_image->planar_format;
+ image->usage = orig_image->usage;
image->dri_format = orig_image->dri_format;
image->format = orig_image->format;
image->offset = orig_image->offset;
image->data = loaderPrivate;
-
- memcpy(image->strides, orig_image->strides, sizeof(image->strides));
- memcpy(image->offsets, orig_image->offsets, sizeof(image->offsets));
-
+
return image;
}
@@ -471,76 +416,40 @@ intel_validate_usage(__DRIimage *image, unsigned int use)
return GL_FALSE;
}
+ /* We only support write for cursor drm images */
+ if ((use & __DRI_IMAGE_USE_WRITE) &&
+ use != (__DRI_IMAGE_USE_WRITE | __DRI_IMAGE_USE_CURSOR))
+ return GL_FALSE;
+
return GL_TRUE;
}
-static __DRIimage *
-intel_create_image_from_names(__DRIscreen *screen,
- int width, int height, int fourcc,
- int *names, int num_names,
- int *strides, int *offsets,
- void *loaderPrivate)
+static int
+intel_image_write(__DRIimage *image, const void *buf, size_t count)
{
- struct intel_image_format *f = NULL;
- __DRIimage *image;
- int i, index;
-
- if (screen == NULL || names == NULL || num_names != 1)
- return NULL;
-
- for (i = 0; i < ARRAY_SIZE(intel_image_formats); i++) {
- if (intel_image_formats[i].fourcc == fourcc) {
- f = &intel_image_formats[i];
- }
- }
+ if (image->region->map_refcount)
+ return -1;
+ if (!(image->usage & __DRI_IMAGE_USE_WRITE))
+ return -1;
- if (f == NULL)
- return NULL;
+ drm_intel_bo_map(image->region->bo, true);
+ memcpy(image->region->bo->virtual, buf, count);
+ drm_intel_bo_unmap(image->region->bo);
- image = intel_create_image_from_name(screen, width, height,
- __DRI_IMAGE_FORMAT_NONE,
- names[0], strides[0],
- loaderPrivate);
-
- if (image == NULL)
- return NULL;
-
- image->planar_format = f;
- for (i = 0; i < f->nplanes; i++) {
- index = f->planes[i].buffer_index;
- image->offsets[index] = offsets[index];
- image->strides[index] = strides[index];
- }
-
- return image;
+ return 0;
}
static __DRIimage *
-intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
+intel_create_sub_image(__DRIimage *parent,
+ int width, int height, int dri_format,
+ int offset, int pitch, void *loaderPrivate)
{
- int width, height, offset, stride, dri_format, cpp, index, pitch;
- struct intel_image_format *f;
- uint32_t mask_x, mask_y;
__DRIimage *image;
-
- if (parent == NULL || parent->planar_format == NULL)
- return NULL;
-
- f = parent->planar_format;
-
- if (plane >= f->nplanes)
- return NULL;
-
- width = parent->region->width >> f->planes[plane].width_shift;
- height = parent->region->height >> f->planes[plane].height_shift;
- dri_format = f->planes[plane].dri_format;
- index = f->planes[plane].buffer_index;
- offset = parent->offsets[index];
- stride = parent->strides[index];
+ int cpp;
+ uint32_t mask_x, mask_y;
image = intel_allocate_image(dri_format, loaderPrivate);
- cpp = _mesa_get_format_bytes(image->format); /* safe since no none format */
- pitch = stride / cpp;
+ cpp = _mesa_get_format_bytes(image->format);
if (offset + height * cpp * pitch > parent->region->bo->size) {
_mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds");
FREE(image);
@@ -581,8 +490,8 @@ static struct __DRIimageExtensionRec intelImageExtension = {
intel_query_image,
intel_dup_image,
intel_validate_usage,
- intel_create_image_from_names,
- intel_from_planar
+ intel_image_write,
+ intel_create_sub_image
};
static const __DRIextension *intelScreenExtensions[] = {

View File

@ -0,0 +1,57 @@
From 6a934ff6638352b2c28cf5a7452fed2f32853c17 Mon Sep 17 00:00:00 2001
From: Anssi Hannula <anssi.hannula@iki.fi>
Date: Sun, 5 Aug 2012 00:47:06 +0300
Subject: [PATCH] Fix undefined symbols in libOSMesa and libglapi
---
src/mapi/shared-glapi/Makefile.am | 2 +-
src/mesa/Makefile.am | 2 +-
src/mesa/drivers/osmesa/Makefile.am | 6 ++++++
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/mapi/shared-glapi/Makefile.am b/src/mapi/shared-glapi/Makefile.am
index 8db7688..8d41db2 100644
--- a/src/mapi/shared-glapi/Makefile.am
+++ b/src/mapi/shared-glapi/Makefile.am
@@ -6,7 +6,7 @@ include $(top_srcdir)/src/mapi/mapi/sources.mak
lib_LTLIBRARIES = libglapi.la
libglapi_la_SOURCES = $(MAPI_GLAPI_FILES)
-libglapi_la_LDFLAGS = -no-undefined
+libglapi_la_LDFLAGS = -no-undefined -pthread
include $(GLAPI)/gen/glapi_gen.mk
glapi_mapi_tmp.h : $(GLAPI)/gen/gl_and_es_API.xml $(glapi_gen_mapi_deps)
diff --git a/src/mesa/Makefile.am b/src/mesa/Makefile.am
index bb70ed6..82b2f36 100644
--- a/src/mesa/Makefile.am
+++ b/src/mesa/Makefile.am
@@ -120,7 +120,7 @@ libmesa_la_SOURCES = \
$(MESA_CXX_FILES) \
$(MESA_ASM_FILES_FOR_ARCH)
-libmesa_la_LIBADD = $(top_builddir)/src/glsl/libglsl.la
+libmesa_la_LIBADD = $(top_builddir)/src/glsl/libglsl.la -ldl
libmesa_la_LDFLAGS =
libmesagallium_la_SOURCES = \
diff --git a/src/mesa/drivers/osmesa/Makefile.am b/src/mesa/drivers/osmesa/Makefile.am
index dbee925..5a1d88e 100644
--- a/src/mesa/drivers/osmesa/Makefile.am
+++ b/src/mesa/drivers/osmesa/Makefile.am
@@ -39,6 +39,12 @@ lib@OSMESA_LIB@_la_LDFLAGS = -module -version-number @OSMESA_VERSION@ -shared -n
lib@OSMESA_LIB@_la_LIBADD = \
$(top_builddir)/src/mesa/libmesa.la \
$(top_builddir)/src/mapi/glapi/libglapi.la
+lib@OSMESA_LIB@_la_LIBTOOLFLAGS = --tag=CXX
+
+if HAVE_SHARED_GLAPI
+lib@OSMESA_LIB@_la_LDFLAGS += -L$(top_builddir)/$(LIB_DIR)
+lib@OSMESA_LIB@_la_LIBADD += -lglapi
+endif
# Provide compatibility with scripts for the old Mesa build system for
# a while by putting a link to the driver into /lib of the build tree.
--
1.7.10

2086
mesa.spec

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,93 @@
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index 0c58d5f..7922f10 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -152,7 +152,7 @@ static void si_update_descriptors(struct si_context *sctx,
7 + /* copy */
(4 + desc->element_dw_size) * util_bitcount(desc->dirty_mask) + /* update */
4; /* pointer update */
-#if HAVE_LLVM >= 0x0305
+#if HAVE_LLVM >= 0x0304
if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0)
desc->atom.num_dw += 4; /* second pointer update */
@@ -177,7 +177,7 @@ static void si_emit_shader_pointer(struct si_context *sctx,
radeon_emit(cs, va);
radeon_emit(cs, va >> 32);
-#if HAVE_LLVM >= 0x0305
+#if HAVE_LLVM >= 0x0304
if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0) {
radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0));
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 873115b..3f23ff1 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -224,7 +224,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
return 4;
case PIPE_CAP_GLSL_FEATURE_LEVEL:
- return HAVE_LLVM >= 0x0305 ? 330 : 140;
+ return HAVE_LLVM >= 0x0304 ? 330 : 140;
case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
return MIN2(sscreen->b.info.vram_size, 0xFFFFFFFF);
@@ -308,7 +308,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
case PIPE_SHADER_VERTEX:
break;
case PIPE_SHADER_GEOMETRY:
-#if HAVE_LLVM < 0x0305
+#if HAVE_LLVM < 0x0304
return 0;
#endif
break;
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 6d5408b..1434986 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2173,7 +2173,7 @@ static void *si_create_fs_state(struct pipe_context *ctx,
return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT);
}
-#if HAVE_LLVM >= 0x0305
+#if HAVE_LLVM >= 0x0304
static void *si_create_gs_state(struct pipe_context *ctx,
const struct pipe_shader_state *state)
@@ -2203,7 +2203,7 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
sctx->vs_shader = sel;
}
-#if HAVE_LLVM >= 0x0305
+#if HAVE_LLVM >= 0x0304
static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
{
@@ -2271,7 +2271,7 @@ static void si_delete_vs_shader(struct pipe_context *ctx, void *state)
si_delete_shader_selector(ctx, sel);
}
-#if HAVE_LLVM >= 0x0305
+#if HAVE_LLVM >= 0x0304
static void si_delete_gs_shader(struct pipe_context *ctx, void *state)
{
@@ -2767,7 +2767,7 @@ static void si_bind_vs_sampler_states(struct pipe_context *ctx, unsigned count,
si_set_sampler_states(sctx, pm4, count, states,
&sctx->samplers[PIPE_SHADER_VERTEX],
R_00B130_SPI_SHADER_USER_DATA_VS_0);
-#if HAVE_LLVM >= 0x0305
+#if HAVE_LLVM >= 0x0304
si_set_sampler_states(sctx, pm4, count, states,
&sctx->samplers[PIPE_SHADER_VERTEX],
R_00B330_SPI_SHADER_USER_DATA_ES_0);
@@ -2999,7 +2999,7 @@ void si_init_state_functions(struct si_context *sctx)
sctx->b.b.bind_fs_state = si_bind_ps_shader;
sctx->b.b.delete_vs_state = si_delete_vs_shader;
sctx->b.b.delete_fs_state = si_delete_ps_shader;
-#if HAVE_LLVM >= 0x0305
+#if HAVE_LLVM >= 0x0304
sctx->b.b.create_gs_state = si_create_gs_state;
sctx->b.b.bind_gs_state = si_bind_gs_shader;
sctx->b.b.delete_gs_state = si_delete_gs_shader;

55
sanitize-tarball.sh Executable file
View File

@ -0,0 +1,55 @@
#!/bin/sh
#
# usage: sanitize-tarball.sh [tarball]
if [ "x$1" = "x" ]; then
echo "Usage: sanitize-tarball.sh [tarball]"
exit 1
fi
if [ -e /usr/bin/pxz ]; then
XZ=/usr/bin/pxz
else
XZ=/usr/bin/xz
fi
dirname=$(basename $(basename "$1" .tar.bz2) .tar.xz)
tar xf "$1"
pushd $dirname
cat > src/gallium/auxiliary/vl/vl_mpeg12_decoder.c << EOF
#include "vl_mpeg12_decoder.h"
struct pipe_video_codec *
vl_create_mpeg12_decoder(struct pipe_context *context,
const struct pipe_video_codec *templat)
{
return NULL;
}
EOF
cat > src/gallium/auxiliary/vl/vl_decoder.c << EOF
#include "vl_decoder.h"
bool
vl_profile_supported(struct pipe_screen *screen, enum pipe_video_profile profile,
enum pipe_video_entrypoint entrypoint)
{
return false;
}
int
vl_level_supported(struct pipe_screen *screen, enum pipe_video_profile profile)
{
return 0;
}
struct pipe_video_codec *
vl_create_decoder(struct pipe_context *pipe,
const struct pipe_video_codec *templat)
{
return NULL;
}
EOF
popd
tar cf - $dirname | $XZ > $dirname.tar.xz

View File

@ -1 +1 @@
SHA512 (mesa-20.0.2.tar.xz) = d6ffc29bbc5b908cb0f08fa1b5a83e029b76c7b697c488a73e6bb60990a55beeb3ecdba1745868f6885ee2f660975f5debf7d2c9418e0a96e2f7049e83fd89ab
24874de926ab6bf46dab9c583e21996a mesa-8baed872126b331aa8d789b78986c0100c6d853a.tar.xz