Compare commits

..

2 Commits
master ... f19

Author SHA1 Message Date
Igor Gnatenko 1331db914b Merge branch 'master' into f19
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>

Conflicts:
	.gitignore
	mesa.spec
	sources
2013-11-28 14:29:12 +04:00
Igor Gnatenko 3e12a5308c 9.2.3 upstream release
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
2013-11-14 15:11:26 +04:00
22 changed files with 2611 additions and 1441 deletions

63
.gitignore vendored
View File

@ -1,8 +1,61 @@
*.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

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,224 @@
From 430343da5988f53ee6eedffb55ab38fa7cf64fd5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= <maraeo@gmail.com>
Date: Fri, 10 May 2013 03:42:23 +0200
Subject: [PATCH] st/mesa: handle texture_from_pixmap and other surface-based
textures correctly
There were 2 issues with it:
1) The texture format which should be used for texturing was only set
in gl_texture_image::TexFormat, which wasn't used for sampler views.
2) Textures are sometimes reallocated under some circumstances
in st_finalize_texture, which is unacceptable if the texture comes
from a window system.
The issues are resolved as follows:
1) If surface_based is true (texture_from_pixmap, etc.), store the format
in a new variable st_texture_object::surface_format.
2) Don't reallocate a surface-based texture in st_finalize_texture.
Also don't use st_ChooseTextureFormat is st_context_teximage, because
the format is dictated by the caller.
This fixes the glx-tfp piglit test.
---
src/mesa/state_tracker/st_atom_texture.c | 3 ++-
src/mesa/state_tracker/st_cb_eglimage.c | 1 +
src/mesa/state_tracker/st_cb_texture.c | 7 ++++++-
src/mesa/state_tracker/st_format.c | 35 --------------------------------
src/mesa/state_tracker/st_format.h | 4 ----
src/mesa/state_tracker/st_manager.c | 25 +++++------------------
src/mesa/state_tracker/st_texture.h | 10 +++++++--
7 files changed, 22 insertions(+), 63 deletions(-)
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index 8d1250f..d79e04c 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -239,7 +239,8 @@ update_single_texture(struct st_context *st,
st_mesa_format_to_pipe_format(stObj->base._BufferObjectFormat);
}
else {
- view_format = stObj->pt->format;
+ view_format =
+ stObj->surface_based ? stObj->surface_format : stObj->pt->format;
/* If sRGB decoding is off, use the linear format */
if (samp->sRGBDecode == GL_SKIP_DECODE_EXT) {
diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
index b162870..a396b9e 100644
--- a/src/mesa/state_tracker/st_cb_eglimage.c
+++ b/src/mesa/state_tracker/st_cb_eglimage.c
@@ -131,6 +131,7 @@ st_bind_surface(struct gl_context *ctx, GLenum target,
stObj->width0 = ps->width;
stObj->height0 = ps->height;
stObj->depth0 = 1;
+ stObj->surface_format = ps->format;
_mesa_dirty_texobj(ctx, texObj, GL_TRUE);
}
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 123ed2b..56dbe85 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1540,6 +1540,11 @@ st_finalize_texture(struct gl_context *ctx,
pipe_sampler_view_release(st->pipe, &stObj->sampler_view);
}
+ /* If this texture comes from a window system, there is nothing else to do. */
+ if (stObj->surface_based) {
+ return GL_TRUE;
+ }
+
/* Find gallium format for the Mesa texture */
firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat);
@@ -1567,7 +1572,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 ||
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index c9c6163..56f3a4a 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -1800,41 +1800,6 @@ st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
}
-GLboolean
-st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
-{
- if (format1 == format2)
- return GL_TRUE;
-
- if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
- format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
- return GL_TRUE;
-
- if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
- format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
- return GL_TRUE;
-
- if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
- format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
- return GL_TRUE;
-
- if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
- format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
- return GL_TRUE;
-
- if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
- format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
- return GL_TRUE;
-
- if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
- format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
- return GL_TRUE;
-
- return GL_FALSE;
-}
-
-
-
/**
* This is used for translating texture border color and the clear
* color. For example, the clear color is interpreted according to
diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h
index 0a1c18d..6e97dcb 100644
--- a/src/mesa/state_tracker/st_format.h
+++ b/src/mesa/state_tracker/st_format.h
@@ -70,10 +70,6 @@ size_t
st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
GLenum internalFormat, int samples[16]);
-/* can we use a sampler view to translate these formats
- only used to make TFP so far */
-extern GLboolean
-st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2);
extern void
diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
index 5561af6..9e537f3 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -467,7 +467,7 @@ st_context_flush(struct st_context_iface *stctxi, unsigned flags,
static boolean
st_context_teximage(struct st_context_iface *stctxi,
enum st_texture_type tex_type,
- int level, enum pipe_format internal_format,
+ int level, enum pipe_format pipe_format,
struct pipe_resource *tex, boolean mipmap)
{
struct st_context *st = (struct st_context *) stctxi;
@@ -511,29 +511,13 @@ st_context_teximage(struct st_context_iface *stctxi,
texImage = _mesa_get_tex_image(ctx, texObj, target, level);
stImage = st_texture_image(texImage);
if (tex) {
- gl_format texFormat;
-
- /*
- * XXX When internal_format and tex->format differ, st_finalize_texture
- * needs to allocate a new texture with internal_format and copy the
- * texture here into the new one. It will result in surface_copy being
- * called on surfaces whose formats differ.
- *
- * To avoid that, internal_format is (wrongly) ignored here. A sane fix
- * is to use a sampler view.
- */
- if (!st_sampler_compat_formats(tex->format, internal_format))
- internal_format = tex->format;
-
- if (util_format_get_component_bits(internal_format,
- UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
+ gl_format texFormat = st_pipe_format_to_mesa_format(pipe_format);
+
+ if (util_format_has_alpha(tex->format))
internalFormat = GL_RGBA;
else
internalFormat = GL_RGB;
- texFormat = st_ChooseTextureFormat(ctx, target, internalFormat,
- GL_BGRA, GL_UNSIGNED_BYTE);
-
_mesa_init_teximage_fields(ctx, texImage,
tex->width0, tex->height0, 1, 0,
internalFormat, texFormat);
@@ -562,6 +546,7 @@ st_context_teximage(struct st_context_iface *stctxi,
stObj->width0 = width;
stObj->height0 = height;
stObj->depth0 = depth;
+ stObj->surface_format = pipe_format;
_mesa_dirty_texobj(ctx, texObj, GL_TRUE);
_mesa_unlock_texture(ctx, texObj);
diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h
index da899c9..c15aeae 100644
--- a/src/mesa/state_tracker/st_texture.h
+++ b/src/mesa/state_tracker/st_texture.h
@@ -87,10 +87,16 @@ struct st_texture_object
*/
struct pipe_sampler_view *sampler_view;
- /* True if there is/was a surface bound to this texture object. It helps
- * track whether the texture object is surface based or not.
+ /* True if this texture comes from the window system. Such a texture
+ * cannot be reallocated and the format can only be changed with a sampler
+ * view or a surface.
*/
GLboolean surface_based;
+
+ /* If surface_based is true, this format should be used for all sampler
+ * views and surfaces instead of pt->format.
+ */
+ enum pipe_format surface_format;
};
--
1.8.2.1

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

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

@ -0,0 +1,28 @@
#!/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
DIRNAME=mesa-$( date +%Y%m%d )
echo REF ${REF:+--reference $REF}
echo DIRNAME $DIRNAME
echo HEAD ${1:-9.2}
rm -rf $DIRNAME
git clone --depth 1 ${REF:+--reference $REF} --branch 9.2 \
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

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,12 @@
diff -up mesa-20130610/src/gallium/drivers/r600/evergreen_state.c.jx mesa-20130610/src/gallium/drivers/r600/evergreen_state.c
--- mesa-20130610/src/gallium/drivers/r600/evergreen_state.c.jx 2013-06-10 13:58:51.000000000 -0400
+++ mesa-20130610/src/gallium/drivers/r600/evergreen_state.c 2013-06-17 10:24:14.687160428 -0400
@@ -615,7 +615,7 @@ static uint32_t r600_translate_colorform
static uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
{
- if (R600_BIG_ENDIAN) {
+ if (0 && R600_BIG_ENDIAN) {
switch(colorformat) {
/* 8-bit buffers. */

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;

View File

@ -0,0 +1,27 @@
Neither of these drivers does anything on-GPU, so, no.
diff -up mesa-20130508/src/gallium/targets/Makefile.am.jx mesa-20130508/src/gallium/targets/Makefile.am
--- mesa-20130508/src/gallium/targets/Makefile.am.jx 2013-05-08 13:23:41.000000000 -0400
+++ mesa-20130508/src/gallium/targets/Makefile.am 2013-05-08 14:59:50.897835932 -0400
@@ -78,10 +78,6 @@ endif
if HAVE_ST_XVMC
SUBDIRS += xvmc-r300
endif
-
-if HAVE_ST_VDPAU
-SUBDIRS += vdpau-r300
-endif
endif
if HAVE_GALLIUM_R600
@@ -142,10 +138,6 @@ endif
if HAVE_ST_XVMC
SUBDIRS += xvmc-softpipe
endif
-
-if HAVE_ST_VDPAU
-SUBDIRS += vdpau-softpipe
-endif
endif
if NEED_GALLIUM_LOADER

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

2011
mesa.spec

File diff suppressed because it is too large Load Diff

12
nv50-fix-build.patch Normal file
View File

@ -0,0 +1,12 @@
diff -up mesa-20130213/src/gallium/drivers/nv50/codegen/nv50_ir.cpp.rtti mesa-20130213/src/gallium/drivers/nv50/codegen/nv50_ir.cpp
--- mesa-20130213/src/gallium/drivers/nv50/codegen/nv50_ir.cpp.rtti 2013-02-13 18:08:17.533677028 +1000
+++ mesa-20130213/src/gallium/drivers/nv50/codegen/nv50_ir.cpp 2013-02-13 18:08:20.496752128 +1000
@@ -716,7 +716,7 @@ Instruction::clone(ClonePolicy<Function>
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);

56
sanitize-tarball.sh Executable file
View File

@ -0,0 +1,56 @@
#!/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_decoder *
vl_create_mpeg12_decoder(struct pipe_context *context,
enum pipe_video_profile profile,
enum pipe_video_entrypoint entrypoint,
enum pipe_video_chroma_format chroma_format,
unsigned width, unsigned height,
unsigned max_references,
bool expect_chunked_decode)
{
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)
{
return false;
}
struct pipe_video_decoder *
vl_create_decoder(struct pipe_context *pipe,
enum pipe_video_profile profile,
enum pipe_video_entrypoint entrypoint,
enum pipe_video_chroma_format chroma_format,
unsigned width, unsigned height, unsigned max_references,
bool expect_chunked_decode)
{
return NULL;
}
EOF
popd
tar cf - $dirname | $XZ > $dirname.tar.xz

View File

@ -1 +1 @@
SHA512 (mesa-20.0.2.tar.xz) = d6ffc29bbc5b908cb0f08fa1b5a83e029b76c7b697c488a73e6bb60990a55beeb3ecdba1745868f6885ee2f660975f5debf7d2c9418e0a96e2f7049e83fd89ab
0f501dfd50b6094774b0d564d745a285 mesa-20131128.tar.xz