xorg-server: Changes to 'upstream-unstable'
Xext/Makefile.am | 7
Xext/vidmode.c | 2151 +++++++++++++++++++++++
Xext/xvmain.c | 11
Xext/xvmc.c | 17
autogen.sh | 3
configure.ac | 29
dix/dixutils.c | 22
dix/window.c | 32
dri3/dri3_request.c | 4
glamor/Makefile.am | 6
glamor/glamor.c | 16
glamor/glamor.h | 4
glamor/glamor_composite_glyphs.c | 14
glamor/glamor_copy.c | 15
glamor/glamor_core.c | 22
glamor/glamor_dash.c | 6
glamor/glamor_egl.c | 189 +-
glamor/glamor_egl_stubs.c | 6
glamor/glamor_fbo.c | 43
glamor/glamor_glyphblt.c | 12
glamor/glamor_gradient.c | 33
glamor/glamor_lines.c | 6
glamor/glamor_picture.c | 49
glamor/glamor_points.c | 7
glamor/glamor_priv.h | 50
glamor/glamor_program.c | 49
glamor/glamor_program.h | 1
glamor/glamor_rects.c | 7
glamor/glamor_render.c | 424 ++--
glamor/glamor_segs.c | 6
glamor/glamor_spans.c | 23
glamor/glamor_text.c | 8
glamor/glamor_transfer.c | 18
glamor/glamor_transform.c | 23
glamor/glamor_transform.h | 15
glamor/glamor_utils.h | 52
glamor/glamor_vbo.c | 9
glamor/glamor_xv.c | 224 +-
glx/extension_string.c | 2
glx/extension_string.h | 2
glx/glxcmds.c | 59
glx/glxdri2.c | 6
glx/glxdriswrast.c | 1
hw/dmx/glxProxy/glxcmds.c | 5
hw/kdrive/ephyr/ephyr_glamor_glx.c | 122 +
hw/kdrive/linux/evdev.c | 11
hw/kdrive/src/kdrive.c | 4
hw/vfb/InitOutput.c | 4
hw/xfree86/Makefile.am | 4
hw/xfree86/common/Makefile.am | 5
hw/xfree86/common/vidmodeproc.h | 83
hw/xfree86/common/xf86Config.c | 8
hw/xfree86/common/xf86Extensions.c | 3
hw/xfree86/common/xf86Helper.c | 4
hw/xfree86/common/xf86Init.c | 1
hw/xfree86/common/xf86Privstr.h | 10
hw/xfree86/common/xf86VidMode.c | 582 ++----
hw/xfree86/common/xf86str.h | 92
hw/xfree86/common/xf86vmode.c | 1955 --------------------
hw/xfree86/dri/dri.c | 8
hw/xfree86/dri2/dri2.c | 130 -
hw/xfree86/dri2/pci_ids/Makefile.am | 1
hw/xfree86/dri2/pci_ids/pci_id_driver_map.h | 7
hw/xfree86/dri2/pci_ids/virtio_gpu_pci_ids.h | 2
hw/xfree86/drivers/modesetting/dri2.c | 4
hw/xfree86/drivers/modesetting/drmmode_display.c | 1
hw/xfree86/modes/xf86Crtc.c | 6
hw/xfree86/modes/xf86Cursors.c | 21
hw/xfree86/modes/xf86RandR12.c | 4
hw/xfree86/ramdac/xf86Cursor.c | 24
hw/xfree86/ramdac/xf86Cursor.h | 1
hw/xquartz/darwinEvents.c | 2
hw/xquartz/quartz.c | 4
hw/xquartz/quartz.h | 2
hw/xwayland/Makefile.am | 9
hw/xwayland/xwayland-glamor-xv.c | 412 ++++
hw/xwayland/xwayland-glamor.c | 29
hw/xwayland/xwayland-input.c | 10
hw/xwayland/xwayland-output.c | 10
hw/xwayland/xwayland-shm.c | 12
hw/xwayland/xwayland-vidmode.c | 408 ++++
hw/xwayland/xwayland.c | 15
hw/xwayland/xwayland.h | 10
hw/xwin/winauth.c | 17
hw/xwin/winclipboard/internal.h | 8
hw/xwin/winclipboard/thread.c | 9
hw/xwin/winclipboard/wndproc.c | 109 -
hw/xwin/winconfig.c | 74
hw/xwin/winlayouts.h | 5
hw/xwin/winmultiwindowclass.h | 28
hw/xwin/winmultiwindowwindow.c | 30
hw/xwin/winmultiwindowwm.c | 7
hw/xwin/winrandr.c | 96 -
include/Makefile.am | 2
include/displaymode.h | 102 +
include/dix-config.h.in | 3
include/dix.h | 8
include/vidmodestr.h | 142 +
include/window.h | 8
os/osdep.h | 6
present/present.c | 122 -
randr/rrmonitor.c | 15
randr/rroutput.c | 12
record/record.c | 1
render/picture.c | 3
test/Makefile.am | 2
xfixes/cursor.c | 4
107 files changed, 4958 insertions(+), 3563 deletions(-)
New commits:
commit 93d4224ccf3dee5a51815a66f76c905450419b50
Author: Adam Jackson <ajax@redhat.com>
Date: Fri Mar 11 16:38:52 2016 -0500
xserver 1.18.2
Signed-off-by: Adam Jackson <ajax@redhat.com>
diff --git a/configure.ac b/configure.ac
index 750fc58..612fff4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,9 +26,9 @@ dnl
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.60)
-AC_INIT([xorg-server], 1.18.1, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
-RELEASE_DATE="2016-02-08"
-RELEASE_NAME="Spanakopita"
+AC_INIT([xorg-server], 1.18.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+RELEASE_DATE="2016-03-11"
+RELEASE_NAME="Saganaki"
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
commit d88f8ffeb7ec0304d793388be5b65a293505bc3b
Author: Adam Jackson <ajax@redhat.com>
Date: Fri Mar 11 13:50:32 2016 -0500
vidmode: Remove stray vidmodeproc.h from EXTRA_DIST
Was removed from the tree in:
commit f175cf45aebcdda53f3ae49c0eaf27da1f194e92
Author: Olivier Fourdan <ofourdan@redhat.com>
Date: Wed Feb 10 09:34:34 2016 +0100
vidmode: move to a separate library of its own
but not removed from the Makefile, which broke 'make dist'.
Signed-off-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit 744c292ae49dd1f9d33b860d2b4f0ae27023809b)
diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index 2eed5de..caae7fd 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -67,7 +67,6 @@ CLEANFILES = $(BUILT_SOURCES)
EXTRA_DIST = \
compiler.h \
fourcc.h \
- vidmodeproc.h \
xf86.h \
xf86Bus.h \
xf86Config.h \
commit 643359fb03c51244c9ed5f5efab4c84594259e8c
Author: Dave Airlie <airlied@gmail.com>
Date: Tue Feb 9 16:54:22 2016 +1000
present: fail flipping if we have any slave outputs
Due to the way present currently works, we don't ever check with the
secondary adapters if we can flip at all.
We shouldn't flip if the secondary adapters are attached to the pixmap
currently, however using the current check_flip callback isn't possible
as it passes the Window to the driver (something we shouldn't be doing),
so the slave driver can never get it's own screen ptr back.
For now to fix the problem just block flips if we have any slaves
configured. We can fix the ABI up later, but this fix can be backported
to stable.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Keith Packard <keithp@keithp.com>
(cherry picked from commit 47bc7fcaa567b0d9e2627b4a21b112e96f81725b)
diff --git a/present/present.c b/present/present.c
index 1ce16af..55f6aa7 100644
--- a/present/present.c
+++ b/present/present.c
@@ -144,6 +144,10 @@ present_check_flip(RRCrtcPtr crtc,
if (!screen_priv->info->flip)
return FALSE;
+ /* Fail to flip if we have slave outputs */
+ if (!xorg_list_is_empty(&screen->output_slave_list))
+ return FALSE;
+
/* Make sure the window hasn't been redirected with Composite */
window_pixmap = screen->GetWindowPixmap(window);
if (window_pixmap != screen->GetScreenPixmap(screen) &&
commit 3e480c6f5168e7da1521bdcc15ed8b5b8762612d
Author: Adam Jackson <ajax@redhat.com>
Date: Thu Jan 21 12:47:57 2016 -0500
glx: Implement GLX_EXT_fbconfig_packed_float
The tokens for this are already defined by GLX_ARB_fbconfig_float, which
we already support, so just add the extension to the list and let the
driver provide those configs if it wants.
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit ef3005da3d5dc92b3ee5a0ee78164e739a3216dc)
diff --git a/glx/extension_string.c b/glx/extension_string.c
index c3ddc4c..616c793 100644
--- a/glx/extension_string.c
+++ b/glx/extension_string.c
@@ -82,6 +82,7 @@ static const struct extension_info known_glx_extensions[] = {
{ GLX(EXT_create_context_es_profile), VER(0,0), N, },
{ GLX(EXT_create_context_es2_profile), VER(0,0), N, },
+ { GLX(EXT_fbconfig_packed_float), VER(0,0), N, },
{ GLX(EXT_framebuffer_sRGB), VER(0,0), N, },
{ GLX(EXT_import_context), VER(0,0), Y, },
{ GLX(EXT_stereo_tree), VER(0,0), N, },
diff --git a/glx/extension_string.h b/glx/extension_string.h
index c1df91b..425a805 100644
--- a/glx/extension_string.h
+++ b/glx/extension_string.h
@@ -45,6 +45,7 @@ enum {
ARB_multisample_bit,
EXT_create_context_es_profile_bit,
EXT_create_context_es2_profile_bit,
+ EXT_fbconfig_packed_float_bit,
EXT_import_context_bit,
EXT_stereo_tree_bit,
EXT_texture_from_pixmap_bit,
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 89ad808..58e60b9 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -895,6 +895,12 @@ initializeExtensions(__GLXDRIscreen * screen)
LogMessage(X_INFO, "AIGLX: enabled GLX_ARB_fbconfig_float\n");
}
+ /* enable EXT_fbconfig_packed_float (even if there are no packed float fbconfigs) */
+ {
+ __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_fbconfig_packed_float");
+ LogMessage(X_INFO, "AIGLX: enabled GLX_EXT_fbconfig_packed_float\n");
+ }
+
for (i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
__glXEnableExtension(screen->glx_enable_bits,
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index be00f5f..924067c 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -413,6 +413,7 @@ initializeExtensions(__GLXDRIscreen * screen)
/* these are harmless to enable unconditionally */
__glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_framebuffer_sRGB");
__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_fbconfig_float");
+ __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_fbconfig_packed_float");
__glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_make_current_read");
extensions = screen->core->getExtensions(screen->driScreen);
commit b9f7edda0634955711870bb1389095525d4496e3
Author: Adam Jackson <ajax@redhat.com>
Date: Mon May 18 13:00:02 2015 -0400
glx: Implement GLX_EXT_stereo_tree
This is correct as it is, but only because we know no DRI drivers
implement stereo.
v2: Use new ATTRIB macro
Reviewed-by: James Jones <jajones@nvidia.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit d15cb654b6ba365dac9a62064e277adebde2fdab)
diff --git a/glx/extension_string.c b/glx/extension_string.c
index cf90146..c3ddc4c 100644
--- a/glx/extension_string.c
+++ b/glx/extension_string.c
@@ -84,6 +84,7 @@ static const struct extension_info known_glx_extensions[] = {
{ GLX(EXT_create_context_es2_profile), VER(0,0), N, },
{ GLX(EXT_framebuffer_sRGB), VER(0,0), N, },
{ GLX(EXT_import_context), VER(0,0), Y, },
+ { GLX(EXT_stereo_tree), VER(0,0), N, },
{ GLX(EXT_texture_from_pixmap), VER(0,0), Y, },
{ GLX(EXT_visual_info), VER(0,0), Y, },
{ GLX(EXT_visual_rating), VER(0,0), Y, },
diff --git a/glx/extension_string.h b/glx/extension_string.h
index ffaab07..c1df91b 100644
--- a/glx/extension_string.h
+++ b/glx/extension_string.h
@@ -46,6 +46,7 @@ enum {
EXT_create_context_es_profile_bit,
EXT_create_context_es2_profile_bit,
EXT_import_context_bit,
+ EXT_stereo_tree_bit,
EXT_texture_from_pixmap_bit,
EXT_visual_info_bit,
EXT_visual_rating_bit,
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 139432e..561faeb 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1921,6 +1921,11 @@ __glXDisp_CopySubBufferMESA(__GLXclientState * cl, GLbyte * pc)
return Success;
}
+/* hack for old glxext.h */
+#ifndef GLX_STEREO_TREE_EXT
+#define GLX_STEREO_TREE_EXT 0x20F5
+#endif
+
/*
** Get drawable attributes
*/
@@ -1931,7 +1936,7 @@ DoGetDrawableAttributes(__GLXclientState * cl, XID drawId)
xGLXGetDrawableAttributesReply reply;
__GLXdrawable *pGlxDraw = NULL;
DrawablePtr pDraw;
- CARD32 attributes[16];
+ CARD32 attributes[18];
int num = 0, error;
if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
@@ -1964,6 +1969,9 @@ DoGetDrawableAttributes(__GLXclientState * cl, XID drawId)
if (pGlxDraw->type == GLX_DRAWABLE_PBUFFER) {
ATTRIB(GLX_PRESERVED_CONTENTS, GL_TRUE);
}
+ if (pGlxDraw->type == GLX_DRAWABLE_WINDOW) {
+ ATTRIB(GLX_STEREO_TREE_EXT, 0);
+ }
}
#undef ATTRIB
commit 2b3363418a425bf432b55927d8f8dd93c004c791
Author: Adam Jackson <ajax@redhat.com>
Date: Thu Mar 3 16:50:02 2016 -0500
glx: Add GLX_SCREEN to the GetDrawableAttributes response
libglvnd would like to use this to map from drawable to screen, so it
can know which driver to dispatch to. Refer to the spec proposal here:
https://lists.freedesktop.org/archives/mesa-dev/2016-March/109543.html
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit a18238877bbf9aab95843d849a6f434275e9cd6c)
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index d8a144f..139432e 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1931,7 +1931,7 @@ DoGetDrawableAttributes(__GLXclientState * cl, XID drawId)
xGLXGetDrawableAttributesReply reply;
__GLXdrawable *pGlxDraw = NULL;
DrawablePtr pDraw;
- CARD32 attributes[14];
+ CARD32 attributes[16];
int num = 0, error;
if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
@@ -1954,6 +1954,7 @@ DoGetDrawableAttributes(__GLXclientState * cl, XID drawId)
ATTRIB(GLX_Y_INVERTED_EXT, GL_FALSE);
ATTRIB(GLX_WIDTH, pDraw->width);
ATTRIB(GLX_HEIGHT, pDraw->height);
+ ATTRIB(GLX_SCREEN, pDraw->pScreen->myNum);
if (pGlxDraw) {
ATTRIB(GLX_TEXTURE_TARGET_EXT,
pGlxDraw->target == GL_TEXTURE_2D ?
commit 2541d765fdd1006d649063882e3a667438f1d30e
Author: Adam Jackson <ajax@redhat.com>
Date: Thu Mar 10 12:29:34 2016 -0500
glx: Macroize building the attribute list in DoGetDrawableAttributes
No functional change, just a little easier to read and harder to get
wrong.
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit 47c1d6b7abcfb1c6b478367bbc2e869c91485bc0)
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 6eb3541..d8a144f 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1945,33 +1945,26 @@ DoGetDrawableAttributes(__GLXclientState * cl, XID drawId)
if (pGlxDraw)
pDraw = pGlxDraw->pDraw;
- attributes[2*num] = GLX_Y_INVERTED_EXT;
- attributes[2*num+1] = GL_FALSE;
- num++;
- attributes[2*num] = GLX_WIDTH;
- attributes[2*num+1] = pDraw->width;
- num++;
- attributes[2*num] = GLX_HEIGHT;
- attributes[2*num+1] = pDraw->height;
- num++;
+#define ATTRIB(a, v) do { \
+ attributes[2*num] = (a); \
+ attributes[2*num+1] = (v); \
+ num++; \
+ } while (0)
+
+ ATTRIB(GLX_Y_INVERTED_EXT, GL_FALSE);
+ ATTRIB(GLX_WIDTH, pDraw->width);
+ ATTRIB(GLX_HEIGHT, pDraw->height);
if (pGlxDraw) {
- attributes[2*num] = GLX_TEXTURE_TARGET_EXT;
- attributes[2*num+1] = pGlxDraw->target == GL_TEXTURE_2D ?
- GLX_TEXTURE_2D_EXT :
- GLX_TEXTURE_RECTANGLE_EXT;
- num++;
- attributes[2*num] = GLX_EVENT_MASK;
- attributes[2*num+1] = pGlxDraw->eventMask;
- num++;
- attributes[2*num] = GLX_FBCONFIG_ID;
- attributes[2*num+1] = pGlxDraw->config->fbconfigID;
- num++;
+ ATTRIB(GLX_TEXTURE_TARGET_EXT,
+ pGlxDraw->target == GL_TEXTURE_2D ?
+ GLX_TEXTURE_2D_EXT : GLX_TEXTURE_RECTANGLE_EXT);
+ ATTRIB(GLX_EVENT_MASK, pGlxDraw->eventMask);
+ ATTRIB(GLX_FBCONFIG_ID, pGlxDraw->config->fbconfigID);
if (pGlxDraw->type == GLX_DRAWABLE_PBUFFER) {
- attributes[2*num] = GLX_PRESERVED_CONTENTS;
- attributes[2*num+1] = GL_TRUE;
- num++;
+ ATTRIB(GLX_PRESERVED_CONTENTS, GL_TRUE);
}
}
+#undef ATTRIB
reply = (xGLXGetDrawableAttributesReply) {
.type = X_Reply,
commit 2a7b6ea1a54a4c8174669c1ca38c4665505c4637
Author: Eric Anholt <eric@anholt.net>
Date: Mon Feb 1 13:58:15 2016 -0800
ephyr: Fix redisplay with glamor on GLES.
glamor_transfer.c is still totally broken, though.
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
(cherry picked from commit c01094c5312fbd84146dd83122e5256a8e57d092)
diff --git a/hw/kdrive/ephyr/ephyr_glamor_glx.c b/hw/kdrive/ephyr/ephyr_glamor_glx.c
index 636150d..2f21914 100644
--- a/hw/kdrive/ephyr/ephyr_glamor_glx.c
+++ b/hw/kdrive/ephyr/ephyr_glamor_glx.c
@@ -225,8 +225,10 @@ ephyr_glamor_damage_redisplay(struct ephyr_glamor *glamor,
if (glamor->vao) {
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &old_vao);
glBindVertexArray(glamor->vao);
- } else
+ } else {
+ glBindBuffer(GL_ARRAY_BUFFER, glamor->vbo);
ephyr_glamor_set_vertices(glamor);
+ }
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glUseProgram(glamor->texture_shader);
commit 5af20f15636aa2ede3dac1af9e9afa063564130c
Author: Olivier Fourdan <ofourdan@redhat.com>
Date: Wed Mar 9 16:45:18 2016 +0100
glamor: do not build Xv support when --disable-xv
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
(cherry picked from commit 25ce263fd88684be9370025f93ba3a2bfc72ff1a)
diff --git a/glamor/Makefile.am b/glamor/Makefile.am
index c488029..c631c53 100644
--- a/glamor/Makefile.am
+++ b/glamor/Makefile.am
@@ -46,10 +46,14 @@ libglamor_la_SOURCES = \
glamor_compositerects.c\
glamor_utils.c\
glamor_utils.h\
- glamor_xv.c \
glamor_sync.c \
glamor.h
+if XV
+libglamor_la_SOURCES += \
+ glamor_xv.c
+endif
+
libglamor_egl_stubs_la_SOURCES = glamor_egl_stubs.c
sdk_HEADERS = glamor.h
commit 9fc05b85e544638ccc4b811c19e64312b387c799
Author: Olivier Fourdan <ofourdan@redhat.com>
Date: Wed Mar 9 16:21:18 2016 +0100
xwayland: add glamor Xv adaptor
This adds an Xv adaptor using glamor.
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
(cherry picked from commit da7724d3d277c6c8a814881785b716896802629a)
diff --git a/hw/xwayland/Makefile.am b/hw/xwayland/Makefile.am
index 0905082..0e6a1ea 100644
--- a/hw/xwayland/Makefile.am
+++ b/hw/xwayland/Makefile.am
@@ -32,7 +32,12 @@ Xwayland_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
if GLAMOR_EGL
-Xwayland_SOURCES += xwayland-glamor.c
+Xwayland_SOURCES += \
+ xwayland-glamor.c
+if XV
+Xwayland_SOURCES += \
+ xwayland-glamor-xv.c
+endif
nodist_Xwayland_SOURCES = \
drm-client-protocol.h \
diff --git a/hw/xwayland/xwayland-glamor-xv.c b/hw/xwayland/xwayland-glamor-xv.c
new file mode 100644
index 0000000..c99418d
--- /dev/null
+++ b/hw/xwayland/xwayland-glamor-xv.c
@@ -0,0 +1,412 @@
+/*
+ * Copyright (c) 1998-2003 by The XFree86 Project, Inc.
+ * Copyright © 2013 Red Hat
+ * Copyright © 2014 Intel Corporation
+ * Copyright © 2016 Red Hat
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * Authors:
+ * Olivier Fourdan <ofourdan@redhat.com>
+ *
+ * Derived from the glamor_xf86_xv, ephyr_glamor_xv and xf86xv
+ * implementations
+ */
+
+#include "xwayland.h"
+#include "glamor_priv.h"
+
+#include <X11/extensions/Xv.h>
+
+#define NUM_FORMATS 3
+#define NUM_PORTS 16
+#define ADAPTOR_NAME "glamor textured video"
+#define ENCODER_NAME "XV_IMAGE"
+
+static DevPrivateKeyRec xwlXvScreenPrivateKeyRec;
+#define xwlXvScreenPrivateKey (&xwlXvScreenPrivateKeyRec)
+
+typedef struct {
+ XvAdaptorPtr glxv_adaptor; /* We have only one adaptor, glamor Xv */
+ glamor_port_private *port_privates;
+
+ CloseScreenProcPtr CloseScreen;
+} xwlXvScreenRec, *xwlXvScreenPtr;
+
+typedef struct {
+ char depth;
+ short class;
+} xwlVideoFormatRec, *xwlVideoFormatPtr;
+
+static xwlVideoFormatRec Formats[NUM_FORMATS] = {
+ {15, TrueColor},
+ {16, TrueColor},
+ {24, TrueColor}
+};
+
+static int
+xwl_glamor_xv_stop_video(XvPortPtr pPort,
+ DrawablePtr pDraw)
+{
+ glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
+
+ if (pDraw->type != DRAWABLE_WINDOW)
+ return BadAlloc;
+
+ glamor_xv_stop_video(gpp);
+
+ return Success;
+}
+
+static int
+xwl_glamor_xv_set_port_attribute(XvPortPtr pPort,
+ Atom attribute,
+ INT32 value)
+{
+ glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
+
+ return glamor_xv_set_port_attribute(gpp, attribute, value);
+}
+
+static int
+xwl_glamor_xv_get_port_attribute(XvPortPtr pPort,
+ Atom attribute,
+ INT32 *pValue)
+{
+ glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
+
+ return glamor_xv_get_port_attribute(gpp, attribute, pValue);
+}
+
+static int
+xwl_glamor_xv_query_best_size(XvPortPtr pPort,
+ CARD8 motion,
+ CARD16 vid_w,
+ CARD16 vid_h,
+ CARD16 drw_w,
+ CARD16 drw_h,
+ unsigned int *p_w,
+ unsigned int *p_h)
+{
+ *p_w = drw_w;
+ *p_h = drw_h;
+
+ return Success;
+}
+
+static int
+xwl_glamor_xv_query_image_attributes(XvPortPtr pPort,
+ XvImagePtr format,
+ CARD16 *width,
+ CARD16 *height,
+ int *pitches,
+ int *offsets)
+{
+ return glamor_xv_query_image_attributes(format->id,
+ width,
+ height,
+ pitches,
+ offsets);
+}
+
+static int
+xwl_glamor_xv_put_image(DrawablePtr pDrawable,
+ XvPortPtr pPort,
+ GCPtr pGC,
+ INT16 src_x,
+ INT16 src_y,
+ CARD16 src_w,
+ CARD16 src_h,
+ INT16 drw_x,
+ INT16 drw_y,
+ CARD16 drw_w,
+ CARD16 drw_h,
+ XvImagePtr format,
+ unsigned char *data,
+ Bool sync,
+ CARD16 width,
+ CARD16 height)
+{
+ glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
+
+ RegionRec WinRegion;
+ RegionRec ClipRegion;
+ BoxRec WinBox;
+ int ret = Success;
+
+ if (pDrawable->type != DRAWABLE_WINDOW)
+ return BadWindow;
+
+ WinBox.x1 = pDrawable->x + drw_x;
+ WinBox.y1 = pDrawable->y + drw_y;
+ WinBox.x2 = WinBox.x1 + drw_w;
+ WinBox.y2 = WinBox.y1 + drw_h;
+
+ RegionInit(&WinRegion, &WinBox, 1);
+ RegionInit(&ClipRegion, NullBox, 1);
+ RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
+
+ if (RegionNotEmpty(&ClipRegion))
+ ret = glamor_xv_put_image(gpp,
+ pDrawable,
+ src_x,
+ src_y,
+ pDrawable->x + drw_x,
+ pDrawable->y + drw_y,
+ src_w,
+ src_h,
+ drw_w,
+ drw_h,
+ format->id,
+ data,
+ width,
+ height,
+ sync,
+ &ClipRegion);
+
+ RegionUninit(&WinRegion);
+ RegionUninit(&ClipRegion);
+
+ return ret;
+
+}
+
+static Bool
+xwl_glamor_xv_add_formats(XvAdaptorPtr pa)
+{
+ ScreenPtr pScreen;
+ XvFormatPtr pFormat, pf;
+ VisualPtr pVisual;
+ int numFormat;
+ int totFormat;
+ int numVisuals;
+ int i;
+
+ totFormat = NUM_FORMATS;
+ pFormat = xnfcalloc(totFormat, sizeof(XvFormatRec));
+ pScreen = pa->pScreen;
+ for (pf = pFormat, i = 0, numFormat = 0; i < NUM_FORMATS; i++) {
+ numVisuals = pScreen->numVisuals;
+ pVisual = pScreen->visuals;
+
+ while (numVisuals--) {
+ if ((pVisual->class == Formats[i].class) &&
+ (pVisual->nplanes == Formats[i].depth)) {
+ if (numFormat >= totFormat) {
+ void *moreSpace;
+
+ totFormat *= 2;
+ moreSpace = XNFreallocarray(pFormat, totFormat,
+ sizeof(XvFormatRec));
+ pFormat = moreSpace;
+ pf = pFormat + numFormat;
+ }
+
+ pf->visual = pVisual->vid;
+ pf->depth = Formats[i].depth;
+
+ pf++;
+ numFormat++;
+ }
+ pVisual++;
+ }
+ }
+ pa->nFormats = numFormat;
+ pa->pFormats = pFormat;
+
+ return numFormat != 0;
+}
+
+static Bool
+xwl_glamor_xv_add_ports(XvAdaptorPtr pa)
+{
+ XvPortPtr pPorts, pp;
+ xwlXvScreenPtr xwlXvScreen;
+ unsigned long PortResource = 0;
+ int nPorts;
+ int i;
+
+ pPorts = xnfcalloc(NUM_PORTS, sizeof(XvPortRec));
+ xwlXvScreen = dixLookupPrivate(&(pa->pScreen)->devPrivates,
+ xwlXvScreenPrivateKey);
+ xwlXvScreen->port_privates = xnfcalloc(NUM_PORTS,
+ sizeof(glamor_port_private));
+
+ PortResource = XvGetRTPort();
+ for (pp = pPorts, i = 0, nPorts = 0; i < NUM_PORTS; i++) {
+ if (!(pp->id = FakeClientID(0)))
+ continue;
+
+ pp->pAdaptor = pa;
+
+ glamor_xv_init_port(&xwlXvScreen->port_privates[i]);
+ pp->devPriv.ptr = &xwlXvScreen->port_privates[i];
+
+ if (AddResource(pp->id, PortResource, pp)) {
+ pp++;
+ nPorts++;
+ }
+ }
+
+ pa->base_id = pPorts->id;
+ pa->nPorts = nPorts;
+ pa->pPorts = pPorts;
+
+ return nPorts != 0;
+}
+
+static void
+xwl_glamor_xv_add_attributes(XvAdaptorPtr pa)
+{
+ int i;
+
+ pa->pAttributes = xnfcalloc(glamor_xv_num_attributes, sizeof(XvAttributeRec));
+ memcpy(pa->pAttributes, glamor_xv_attributes,
+ glamor_xv_num_attributes * sizeof(XvAttributeRec));
+
+ for (i = 0; i < glamor_xv_num_attributes; i++)
+ pa->pAttributes[i].name = strdup(glamor_xv_attributes[i].name);
+
+ pa->nAttributes = glamor_xv_num_attributes;
+}
+
+static void
+xwl_glamor_xv_add_images(XvAdaptorPtr pa)
+{
+ pa->pImages = xnfcalloc(glamor_xv_num_images, sizeof(XvImageRec));
+ memcpy(pa->pImages, glamor_xv_images, glamor_xv_num_images * sizeof(XvImageRec));
+
+ pa->nImages = glamor_xv_num_images;
+}
+
+static void
+xwl_glamor_xv_add_encodings(XvAdaptorPtr pa)
+{
+ XvEncodingPtr pe;
+ GLint texsize;
+
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texsize);
+
+ pe = xnfcalloc(1, sizeof(XvEncodingRec));
+ pe->id = 0;
+ pe->pScreen = pa->pScreen;
+ pe->name = strdup(ENCODER_NAME);
+ pe->width = texsize;
+ pe->height = texsize;
+ pe->rate.numerator = 1;
+ pe->rate.denominator = 1;
+
+ pa->pEncodings = pe;
+ pa->nEncodings = 1;
+}
+
+static Bool
+xwl_glamor_xv_add_adaptors(ScreenPtr pScreen)
+{
+ DevPrivateKey XvScreenKey;
+ XvScreenPtr XvScreen;
+ xwlXvScreenPtr xwlXvScreen;
+ XvAdaptorPtr pa;
+
+ if (XvScreenInit(pScreen) != Success)
+ return FALSE;
+
+ XvScreenKey = XvGetScreenKey();
+ XvScreen = dixLookupPrivate(&(pScreen)->devPrivates, XvScreenKey);
+
+ XvScreen->nAdaptors = 0;
+ XvScreen->pAdaptors = NULL;
+
+ pa = xnfcalloc(1, sizeof(XvAdaptorRec));
+ pa->pScreen = pScreen;
+ pa->type = (unsigned int) (XvWindowMask | XvInputMask | XvImageMask);
+ pa->ddStopVideo = xwl_glamor_xv_stop_video;
+ pa->ddPutImage = xwl_glamor_xv_put_image;
+ pa->ddSetPortAttribute = xwl_glamor_xv_set_port_attribute;
+ pa->ddGetPortAttribute = xwl_glamor_xv_get_port_attribute;
+ pa->ddQueryBestSize = xwl_glamor_xv_query_best_size;
+ pa->ddQueryImageAttributes = xwl_glamor_xv_query_image_attributes;
+ pa->name = strdup(ADAPTOR_NAME);
+
+ xwl_glamor_xv_add_encodings(pa);
+ xwl_glamor_xv_add_images(pa);
+ xwl_glamor_xv_add_attributes(pa);
+ if (!xwl_glamor_xv_add_formats(pa))
+ goto failed;
+ if (!xwl_glamor_xv_add_ports(pa))
+ goto failed;
+
+ /* We're good now with out Xv adaptor */
+ XvScreen->nAdaptors = 1;
+ XvScreen->pAdaptors = pa;
+
+ xwlXvScreen = dixLookupPrivate(&(pa->pScreen)->devPrivates,
+ xwlXvScreenPrivateKey);
+ xwlXvScreen->glxv_adaptor = pa;
+
+ return TRUE;
+
+failed:
+ XvFreeAdaptor(pa);
+ free(pa);
+
+ return FALSE;
+}
+
+static Bool
+xwl_glamor_xv_close_screen(ScreenPtr pScreen)
+{
+ xwlXvScreenPtr xwlXvScreen;
+
+ xwlXvScreen = dixLookupPrivate(&(pScreen)->devPrivates,
+ xwlXvScreenPrivateKey);
+
+ if (xwlXvScreen->glxv_adaptor) {
+ XvFreeAdaptor(xwlXvScreen->glxv_adaptor);
+ free(xwlXvScreen->glxv_adaptor);
+ }
+ free(xwlXvScreen->port_privates);
+
+ pScreen->CloseScreen = xwlXvScreen->CloseScreen;
+
+ return pScreen->CloseScreen(pScreen);
+}
+
+Bool
+xwl_glamor_xv_init(ScreenPtr pScreen)
+{
+ xwlXvScreenPtr xwlXvScreen;
+
+ if (!dixRegisterPrivateKey(xwlXvScreenPrivateKey, PRIVATE_SCREEN,
+ sizeof(xwlXvScreenRec)))
+ return FALSE;
+
+ xwlXvScreen = dixLookupPrivate(&(pScreen)->devPrivates,
+ xwlXvScreenPrivateKey);
+
+ xwlXvScreen->port_privates = NULL;
+ xwlXvScreen->glxv_adaptor = NULL;
+ xwlXvScreen->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = xwl_glamor_xv_close_screen;
+
+ glamor_xv_core_init(pScreen);
+
+ return xwl_glamor_xv_add_adaptors(pScreen);
+}
diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c
index 40f22a3..04aa8f2 100644
--- a/hw/xwayland/xwayland-glamor.c
+++ b/hw/xwayland/xwayland-glamor.c
@@ -574,5 +574,10 @@ xwl_glamor_init(struct xwl_screen *xwl_screen)
screen->CreatePixmap = xwl_glamor_create_pixmap;
screen->DestroyPixmap = xwl_glamor_destroy_pixmap;
+#ifdef XV
+ if (!xwl_glamor_xv_init(screen))
+ ErrorF("Failed to initialize glamor Xv extension\n");
+#endif
+
return TRUE;
}
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
index 4b150ed..67b30cb 100644
--- a/hw/xwayland/xwayland.h
+++ b/hw/xwayland/xwayland.h
@@ -190,6 +190,11 @@ Bool xwl_screen_init_glamor(struct xwl_screen *xwl_screen,
uint32_t id, uint32_t version);
struct wl_buffer *xwl_glamor_pixmap_get_wl_buffer(PixmapPtr pixmap);
+#ifdef XV
+/* glamor Xv Adaptor */
+Bool xwl_glamor_xv_init(ScreenPtr pScreen);
+#endif
+
#ifdef XF86VIDMODE
void xwlVidModeExtensionInit(void);
#endif
commit 1aa9a2be313c51a78af9bceea865dcf069e9cebe
Author: Michel Dänzer <michel.daenzer@amd.com>
Date: Mon Dec 21 17:54:08 2015 +0900
modesetting: Allow CRTC transforms to actually take effect
Reply to: