Skip to content
Commits on Source (45)
image: docker:latest
services:
- docker:dind
# IMAGE_TAG is the tag of the docker image used for the build jobs. If the
# image doesn't exist yet, the docker-image stage generates it.
#
# In order to generate a new image, one should generally change the tag.
# While removing the image from the registry would also work, that's not
# recommended except for ephemeral images during development: Replacing an
# image after a significant amount of time might pull in newer versions of
# gcc/clang or other packages, which might break the build with older commits
# using the same tag.
#
# After merging a change resulting in generating a new image to the main
# repository, it's recommended to remove the image from the source repository's
# container registry, so that the image from the main repository's registry
# will be used there as well.
variables:
IMAGE_TAG: "debian-testing-20190219"
IMAGE_LOCAL: "$CI_REGISTRY_IMAGE:$IMAGE_TAG"
IMAGE_MAIN: "registry.freedesktop.org/xorg/xserver:$IMAGE_TAG"
stages:
- docker-image
- build-and-test
debian-testing:
stage: docker-image
only:
changes:
- .gitlab-ci.yml
- .gitlab-ci/Dockerfile
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- mkdir kaniko-context
- |
echo "FROM $IMAGE_LOCAL" > kaniko-context/Dockerfile
# If the image exists in the local registry, skip to the build-and-test job
set +e
set -x
/kaniko/executor --context kaniko-context --no-push && exit 0
set +x
set -e
- |
echo "FROM $IMAGE_MAIN" > kaniko-context/Dockerfile
# Try to re-use the image from the main repository's registry, and if
# that fails, generate a local image from scratch
set +e
set -x
/kaniko/executor --context kaniko-context --destination $IMAGE_LOCAL && exit 0
set +x
set -e
- /kaniko/executor --context $CI_PROJECT_DIR/.gitlab-ci --destination $IMAGE_LOCAL
.common-build-and-test:
stage: build-and-test
image: $IMAGE_LOCAL
artifacts:
when: on_failure
paths:
- build/test/piglit-results/
cache:
paths:
- ccache/
variables:
LC_ALL: C.UTF-8
before_script:
- echo FROM nwnk/xserver-travis-rawhide:v5 > Dockerfile
- echo ADD . /root >> Dockerfile
- echo WORKDIR /root >> Dockerfile
- docker build -t withgit .
- export CCACHE_BASEDIR="$PWD"
- export CCACHE_DIR="$PWD/ccache"
- export CCACHE_COMPILERCHECK=content
- export PATH="/usr/lib/ccache:$PATH"
- ccache --zero-stats
- ccache --show-stats
after_script:
- CCACHE_DIR="$PWD/ccache" ccache --show-stats
autotools-build-and-test:
extends: .common-build-and-test
script:
- mkdir build/
- cd build/
- ../autogen.sh --prefix=/usr
- make -j$(nproc) distcheck
- |
export PIGLIT_DIR=/root/piglit XTEST_DIR=/root/xts
set +e
set -x
make -j$(nproc) check
status=$?
cat test/piglit-results/xvfb/long-summary || :
exit $status
job:
meson-build-and-test:
extends: .common-build-and-test
variables:
PIGLIT_DIR: /root/piglit
XTEST_DIR: /root/xts
script:
- docker run --volume $HOME/.ccache:/root/.ccache withgit ./test/scripts/build-travis-deps.sh
- meson -Dprefix=/usr build/
- |
ninja -C build/ install
set +e
set -x
ninja -C build/ test
status=$?
cat build/meson-logs/testlog.txt
cat build/test/piglit-results/xvfb/long-summary || :
exit $status
FROM debian:testing-slim
WORKDIR /tmp
RUN export DEBIAN_FRONTEND=noninteractive; \
echo 'path-exclude=/usr/share/doc/*' > /etc/dpkg/dpkg.cfg.d/99-exclude-cruft && \
echo 'path-exclude=/usr/share/locale/*' >> /etc/dpkg/dpkg.cfg.d/99-exclude-cruft && \
echo 'path-exclude=/usr/share/man/*' >> /etc/dpkg/dpkg.cfg.d/99-exclude-cruft && \
echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf && \
echo '#!/bin/sh' > /usr/sbin/policy-rc.d && \
echo 'exit 101' >> /usr/sbin/policy-rc.d && \
chmod +x /usr/sbin/policy-rc.d && \
echo 'deb-src https://deb.debian.org/debian testing main' >/etc/apt/sources.list.d/deb-src.list && \
apt-get update && \
apt-get install -y meson git ca-certificates ccache cmake automake autoconf libtool libwaffle-dev \
libxkbcommon-dev python3-mako python3-numpy python3-six x11-utils x11-xserver-utils xauth xvfb && \
apt-get build-dep -y xorg-server && \
\
cd /root && \
git clone https://gitlab.freedesktop.org/mesa/piglit.git && cd piglit && \
cmake -G Ninja -DPIGLIT_BUILD_GL_TESTS=OFF -DPIGLIT_BUILD_GLES1_TESTS=OFF \
-DPIGLIT_BUILD_GLES2_TESTS=OFF -DPIGLIT_BUILD_GLES3_TESTS=OFF \
-DPIGLIT_BUILD_DMA_BUF_TESTS=OFF -DPIGLIT_BUILD_GLX_TESTS=OFF && \
ninja && \
cd .. && \
git clone https://gitlab.freedesktop.org/xorg/test/xts && \
cd xts && ./autogen.sh && xvfb-run make -j$(nproc) && \
cd .. && rm -rf piglit/.git xts/.git && \
echo '[xts]' > piglit/piglit.conf && echo 'path=/root/xts' >> piglit/piglit.conf && \
find -name \*.a -o -name \*.o | xargs rm && \
\
apt-get purge -y git cmake libwaffle-dev libxkbcommon-dev \
x11-utils x11-xserver-utils xauth xvfb && \
apt-get autoremove -y --purge && apt-get clean && \
rm -f /var/lib/apt/lists/deb.debian.org_debian_dists_testing_*
......@@ -6,24 +6,13 @@ branches:
matrix:
include:
- os: linux
dist: trusty
services: docker
env: DISTRO=rawhide:v5
- os: osx
osx_image: xcode9.2
env: DISTRO=xcode9.2
install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install ccache ; fi
before_script:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker pull nwnk/xserver-travis-$DISTRO ; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo FROM nwnk/xserver-travis-$DISTRO > Dockerfile ; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo ADD . /root >> Dockerfile ; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker build -t withgit . ; fi
- HOMEBREW_NO_AUTO_UPDATE=1 brew install ccache
script:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker run --volume $HOME/.ccache:/root/.ccache withgit /bin/sh -c "cd /root && ./test/scripts/build-travis-deps.sh" ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./test/scripts/build-travis-osx.sh ; fi
- ./test/scripts/build-travis-osx.sh
- ccache -s
......@@ -72,7 +72,7 @@ pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = xorg-server.pc
endif
EXTRA_DIST = xorg-server.pc.in xorg-server.m4 autogen.sh
EXTRA_DIST = xorg-server.pc.in xorg-server.m4 autogen.sh README.md
DISTCHECK_CONFIGURE_FLAGS=\
--with-xkb-path=$(XKB_BASE_DIRECTORY) \
......
X Server
--------
The X server accepts requests from client applications to create windows,
which are (normally rectangular) "virtual screens" that the client program
......@@ -18,24 +19,14 @@ Xorg mailing list:
https://lists.freedesktop.org/mailman/listinfo/xorg
Please submit bug reports to the Xorg bugzilla:
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
The master development code repository can be found at:
git://anongit.freedesktop.org/git/xorg/xserver
https://cgit.freedesktop.org/xorg/xserver
https://gitlab.freedesktop.org/xorg/xserver
For patch submission instructions, see:
https://www.x.org/wiki/Development/Documentation/SubmittingPatches
For more information on the git code manager, see:
https://wiki.x.org/wiki/GitPage
As with other projects hosted on freedesktop.org, X.Org follows its
Code of Conduct, based on the Contributor Covenant. Please conduct
yourself in a respectful and civilized manner when using the above
......
......@@ -611,7 +611,9 @@ CreatePointerBarrierClient(ClientPtr client,
}
pbd->deviceid = dev->id;
input_lock();
xorg_list_add(&pbd->entry, &ret->per_device);
input_unlock();
}
ret->id = stuff->barrier;
......@@ -626,7 +628,9 @@ CreatePointerBarrierClient(ClientPtr client,
ret->barrier.directions &= ~(BarrierPositiveX | BarrierNegativeX);
if (barrier_is_vertical(&ret->barrier))
ret->barrier.directions &= ~(BarrierPositiveY | BarrierNegativeY);
input_lock();
xorg_list_add(&ret->entry, &cs->barriers);
input_unlock();
*client_out = ret;
return Success;
......@@ -689,7 +693,9 @@ BarrierFreeBarrier(void *data, XID id)
mieqEnqueue(dev, (InternalEvent *) &ev);
}
input_lock();
xorg_list_del(&c->entry);
input_unlock();
FreePointerBarrierClient(c);
return Success;
......@@ -709,7 +715,9 @@ static void add_master_func(void *res, XID id, void *devid)
pbd = AllocBarrierDevice();
pbd->deviceid = *deviceid;
input_lock();
xorg_list_add(&pbd->entry, &barrier->per_device);
input_unlock();
}
static void remove_master_func(void *res, XID id, void *devid)
......@@ -752,7 +760,9 @@ static void remove_master_func(void *res, XID id, void *devid)
mieqEnqueue(dev, (InternalEvent *) &ev);
}
input_lock();
xorg_list_del(&pbd->entry);
input_unlock();
free(pbd);
}
......
......@@ -26,9 +26,9 @@ dnl
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.60)
AC_INIT([xorg-server], 1.20.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
RELEASE_DATE="2018-10-25"
RELEASE_NAME="Harissa Roasted Carrots"
AC_INIT([xorg-server], 1.20.4, [https://gitlab.freedesktop.org/xorg/xserver/issues], xorg-server)
RELEASE_DATE="2019-02-25"
RELEASE_NAME="Chestnut Tortelloni"
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
......
......@@ -135,7 +135,7 @@ proc_dri3_open(ClientPtr client)
REQUEST_SIZE_MATCH(xDRI3OpenReq);
status = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixReadAccess);
status = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixGetAttrAccess);
if (status != Success)
return status;
......@@ -365,7 +365,7 @@ proc_dri3_get_supported_modifiers(ClientPtr client)
REQUEST_SIZE_MATCH(xDRI3GetSupportedModifiersReq);
status = dixLookupWindow(&window, stuff->window, client, DixReadAccess);
status = dixLookupWindow(&window, stuff->window, client, DixGetAttrAccess);
if (status != Success)
return status;
pScreen = window->drawable.pScreen;
......
......@@ -766,18 +766,27 @@ glamor_set_normalize_tcoords_generic(PixmapPtr pixmap,
*
* We could support many more formats by using GL_ARB_texture_view to
* parse the same bits as different formats. For now, we only support
* tweaking whether we sample the alpha bits of an a8r8g8b8, or just
* force them to 1.
* tweaking whether we sample the alpha bits, or just force them to 1.
*/
static Bool
glamor_render_format_is_supported(PictFormatShort format)
glamor_render_format_is_supported(PicturePtr picture)
{
switch (format) {
PictFormatShort storage_format;
/* Source-only pictures should always work */
if (!picture->pDrawable)
return TRUE;
storage_format = format_for_depth(picture->pDrawable->depth);
switch (picture->format) {
case PICT_x2r10g10b10:
return storage_format == PICT_x2r10g10b10;
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
return storage_format == PICT_a8r8g8b8 || storage_format == PICT_x8r8g8b8;
case PICT_a8:
return TRUE;
return storage_format == PICT_a8;
default:
return FALSE;
}
......@@ -815,7 +824,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail;
}
if (!glamor_render_format_is_supported(dest->format)) {
if (!glamor_render_format_is_supported(dest)) {
glamor_fallback("Unsupported dest picture format.\n");
goto fail;
}
......@@ -978,7 +987,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail;
}
} else {
if (source && !glamor_render_format_is_supported(source->format)) {
if (source && !glamor_render_format_is_supported(source)) {
glamor_fallback("Unsupported source picture format.\n");
goto fail;
}
......@@ -990,7 +999,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail;
}
} else if (mask) {
if (!glamor_render_format_is_supported(mask->format)) {
if (!glamor_render_format_is_supported(mask)) {
glamor_fallback("Unsupported mask picture format.\n");
goto fail;
}
......
......@@ -386,10 +386,6 @@ static int dispatch_GLXVendorPriv(ClientPtr client)
// Note that even if none of the vendors provides a dispatch stub,
// we'll still add an entry to the dispatch table, so that we don't
// have to look it up again later.
disp = (GlxVendorPrivDispatch *) malloc(sizeof(GlxVendorPrivDispatch));
if (disp == NULL) {
return BadAlloc;
}
disp->proc = GetVendorDispatchFunc(stuff->glxCode,
GlxCheckSwap(client,
......
......@@ -1190,7 +1190,7 @@ xf86VideoPtrToDriverList(struct pci_device *dev, XF86MatchedDrivers *md)
{
int idx = 0;
#ifdef __linux__
#if defined(__linux__) || defined(__NetBSD__)
driverList[idx++] = "nouveau";
#endif
driverList[idx++] = "nv";
......
......@@ -174,6 +174,7 @@ CHIPSET(0x3EA4, cfl_gt1, "Intel(R) HD Graphics (Coffeelake 2x6 GT1)")
CHIPSET(0x3E91, cfl_gt2, "Intel(R) UHD Graphics 630 (Coffeelake 3x8 GT2)")
CHIPSET(0x3E92, cfl_gt2, "Intel(R) UHD Graphics 630 (Coffeelake 3x8 GT2)")
CHIPSET(0x3E96, cfl_gt2, "Intel(R) HD Graphics (Coffeelake 3x8 GT2)")
CHIPSET(0x3E98, cfl_gt2, "Intel(R) UHD Graphics 630 (Coffeelake 3x8 GT2)")
CHIPSET(0x3E9A, cfl_gt2, "Intel(R) HD Graphics (Coffeelake 3x8 GT2)")
CHIPSET(0x3E9B, cfl_gt2, "Intel(R) UHD Graphics 630 (Coffeelake 3x8 GT2)")
CHIPSET(0x3E94, cfl_gt2, "Intel(R) HD Graphics (Coffeelake 3x8 GT2)")
......
......@@ -1354,13 +1354,19 @@ drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
{
modesettingPtr ms = modesettingPTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
/* XXX Check if DPMS mode is already the right one */
drmmode_crtc->dpms_mode = mode;
if (ms->atomic_modeset && mode != DPMSModeOn && !ms->pending_modeset)
if (ms->atomic_modeset) {
if (mode != DPMSModeOn && !ms->pending_modeset)
drmmode_crtc_disable(crtc);
} else if (crtc->enabled == FALSE) {
drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
0, 0, 0, NULL, 0, NULL);
}
}
#ifdef GLAMOR_HAS_GBM
......@@ -2834,7 +2840,7 @@ static int parse_path_blob(drmModePropertyBlobPtr path_blob, int *conn_base_id,
if (len + 1> 5)
return -1;
memcpy(conn_id, blob_data + 4, len);
conn_id[len + 1] = '\0';
conn_id[len] = '\0';
id = strtoul(conn_id, NULL, 10);
*conn_base_id = id;
......
......@@ -2019,7 +2019,7 @@ xf86RandR12ChangeGamma(ScrnInfoPtr pScrn, Gamma gamma)
RRCrtcPtr randr_crtc = xf86CompatRRCrtc(pScrn);
int size;
if (!randr_crtc)
if (!randr_crtc || pScrn->LoadPalette == xf86RandR12LoadPalette)
return Success;
size = max(0, randr_crtc->gammaSize);
......
......@@ -76,6 +76,8 @@ nodist_Xquartz_SOURCES = \
Xquartz_LDFLAGS = \
-Wl,-framework,CoreServices
if XQUARTZ
BUILT_SOURCES = \
mach_startupServer.c \
mach_startupUser.c \
......@@ -88,6 +90,8 @@ CLEANFILES = \
$(BUILT_SOURCES): $(srcdir)/mach_startup.defs
mig -sheader mach_startupServer.h $(srcdir)/mach_startup.defs
endif
EXTRA_DIST = \
launchd_fd.h \
mach_startup.defs \
......
......@@ -244,6 +244,9 @@ xwl_glamor_gbm_get_wl_buffer_for_pixmap(PixmapPtr pixmap,
uint64_t modifier;
int i;
if (xwl_pixmap == NULL)
return NULL;
if (xwl_pixmap->buffer) {
/* Buffer already exists. Return it and inform caller if interested. */
if (created)
......@@ -494,6 +497,9 @@ glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
xwl_pixmap = xwl_pixmap_get(pixmap);
if (xwl_pixmap == NULL)
return 0;
if (!xwl_pixmap->bo)
return 0;
......
......@@ -85,28 +85,23 @@ xwl_present_timer_callback(OsTimerPtr timer,
static inline Bool
xwl_present_has_events(struct xwl_present_window *xwl_present_window)
{
return !xorg_list_is_empty(&xwl_present_window->event_list) ||
!xorg_list_is_empty(&xwl_present_window->release_queue);
}
static inline Bool
xwl_present_is_flipping(WindowPtr window, struct xwl_window *xwl_window)
{
return xwl_window && xwl_window->present_window == window;
return !!xwl_present_window->sync_flip ||
!xorg_list_is_empty(&xwl_present_window->event_list);
}
static void
xwl_present_reset_timer(struct xwl_present_window *xwl_present_window)
{
if (xwl_present_has_events(xwl_present_window)) {
WindowPtr present_window = xwl_present_window->window;
Bool is_flipping = xwl_present_is_flipping(present_window,
xwl_window_from_window(present_window));
CARD32 timeout;
if (xwl_present_window->frame_callback)
timeout = TIMER_LEN_FLIP;
else
timeout = TIMER_LEN_COPY;
xwl_present_window->frame_timer = TimerSet(xwl_present_window->frame_timer,
0,
is_flipping ? TIMER_LEN_FLIP :
TIMER_LEN_COPY,
0, timeout,
&xwl_present_timer_callback,
xwl_present_window);
} else {
......@@ -117,16 +112,12 @@ xwl_present_reset_timer(struct xwl_present_window *xwl_present_window)
void
xwl_present_cleanup(WindowPtr window)
{
struct xwl_window *xwl_window = xwl_window_from_window(window);
struct xwl_present_window *xwl_present_window = xwl_present_window_priv(window);
struct xwl_present_event *event, *tmp;
if (!xwl_present_window)
return;
if (xwl_window && xwl_window->present_window == window)
xwl_window->present_window = NULL;
if (xwl_present_window->frame_callback) {
wl_callback_destroy(xwl_present_window->frame_callback);
xwl_present_window->frame_callback = NULL;
......@@ -139,6 +130,16 @@ xwl_present_cleanup(WindowPtr window)
}
/* Clear remaining buffer releases and inform Present about free ressources */
event = xwl_present_window->sync_flip;
xwl_present_window->sync_flip = NULL;
if (event) {
if (event->buffer_released) {
free(event);
} else {
event->pending = FALSE;
event->abort = TRUE;
}
}
xorg_list_for_each_entry_safe(event, tmp, &xwl_present_window->release_queue, list) {
xorg_list_del(&event->list);
event->abort = TRUE;
......@@ -192,11 +193,31 @@ static const struct wl_buffer_listener xwl_present_release_listener = {
};
static void
xwl_present_events_notify(struct xwl_present_window *xwl_present_window)
xwl_present_msc_bump(struct xwl_present_window *xwl_present_window)
{
uint64_t msc = xwl_present_window->msc;
uint64_t msc = ++xwl_present_window->msc;
struct xwl_present_event *event, *tmp;
xwl_present_window->ust = GetTimeInMicros();
event = xwl_present_window->sync_flip;
xwl_present_window->sync_flip = NULL;
if (event) {
event->pending = FALSE;
present_wnmd_event_notify(xwl_present_window->window, event->event_id,
xwl_present_window->ust, msc);
if (event->buffer_released) {
/* If the buffer was already released, clean up now */
present_wnmd_event_notify(xwl_present_window->window, event->event_id,
xwl_present_window->ust, msc);
free(event);
} else {
xorg_list_add(&event->list, &xwl_present_window->release_queue);
}
}
xorg_list_for_each_entry_safe(event, tmp,
&xwl_present_window->event_list,
list) {
......@@ -216,25 +237,14 @@ xwl_present_timer_callback(OsTimerPtr timer,
void *arg)
{
struct xwl_present_window *xwl_present_window = arg;
WindowPtr present_window = xwl_present_window->window;
struct xwl_window *xwl_window = xwl_window_from_window(present_window);
xwl_present_window->frame_timer_firing = TRUE;
xwl_present_window->msc++;
xwl_present_window->ust = GetTimeInMicros();
xwl_present_events_notify(xwl_present_window);
xwl_present_msc_bump(xwl_present_window);
xwl_present_reset_timer(xwl_present_window);
if (xwl_present_has_events(xwl_present_window)) {
/* Still events, restart timer */
return xwl_present_is_flipping(present_window, xwl_window) ? TIMER_LEN_FLIP :
TIMER_LEN_COPY;
} else {
/* No more events, do not restart timer and delete it instead */
xwl_present_free_timer(xwl_present_window);
return 0;
}
}
static void
xwl_present_frame_callback(void *data,
......@@ -251,10 +261,7 @@ xwl_present_frame_callback(void *data,
return;
}
xwl_present_window->msc++;
xwl_present_window->ust = GetTimeInMicros();
xwl_present_events_notify(xwl_present_window);
xwl_present_msc_bump(xwl_present_window);
/* we do not need the timer anymore for this frame,
* reset it for potentially the next one
......@@ -274,6 +281,9 @@ xwl_present_sync_callback(void *data,
struct xwl_present_event *event = data;
struct xwl_present_window *xwl_present_window = event->xwl_present_window;
wl_callback_destroy(xwl_present_window->sync_callback);
xwl_present_window->sync_callback = NULL;
event->pending = FALSE;
if (event->abort) {
......@@ -289,12 +299,14 @@ xwl_present_sync_callback(void *data,
xwl_present_window->ust,
xwl_present_window->msc);
if (event->buffer_released)
if (event->buffer_released) {
/* If the buffer was already released, send the event now again */
present_wnmd_event_notify(xwl_present_window->window,
event->event_id,
xwl_present_window->ust,
xwl_present_window->msc);
xwl_present_free_event(event);
}
}
static const struct wl_callback_listener xwl_present_sync_listener = {
......@@ -311,6 +323,10 @@ xwl_present_get_crtc(WindowPtr present_window)
return NULL;
rr_private = rrGetScrPriv(present_window->drawable.pScreen);
if (rr_private->numCrtcs == 0)
return NULL;
return rr_private->crtcs[0];
}
......@@ -337,17 +353,9 @@ xwl_present_queue_vblank(WindowPtr present_window,
uint64_t event_id,
uint64_t msc)
{
struct xwl_window *xwl_window = xwl_window_from_window(present_window);
struct xwl_present_window *xwl_present_window = xwl_present_window_get_priv(present_window);
struct xwl_present_event *event;
if (!xwl_window)
return BadMatch;
if (xwl_window->present_window &&
xwl_window->present_window != present_window)
return BadMatch;
event = malloc(sizeof *event);
if (!event)
return BadAlloc;
......@@ -416,13 +424,6 @@ xwl_present_check_flip2(RRCrtcPtr crtc,
if (!xwl_window)
return FALSE;
/*
* Do not flip if there is already another child window doing flips.
*/
if (xwl_window->present_window &&
xwl_window->present_window != present_window)
return FALSE;
/*
* We currently only allow flips of windows, that have the same
* dimensions as their xwl_window parent window. For the case of
......@@ -459,19 +460,22 @@ xwl_present_flip(WindowPtr present_window,
if (!event)
return FALSE;
xwl_window->present_window = present_window;
buffer = xwl_glamor_pixmap_get_wl_buffer(pixmap, &buffer_created);
event->event_id = event_id;
event->xwl_present_window = xwl_present_window;
event->buffer = buffer;
event->target_msc = xwl_present_window->msc;
event->target_msc = target_msc;
event->pending = TRUE;
event->abort = FALSE;
event->buffer_released = FALSE;
if (sync_flip) {
xorg_list_init(&event->list);
xwl_present_window->sync_flip = event;
} else {
xorg_list_add(&event->list, &xwl_present_window->release_queue);
}
if (buffer_created)
wl_buffer_add_listener(buffer, &xwl_present_release_listener, NULL);
......@@ -480,13 +484,6 @@ xwl_present_flip(WindowPtr present_window,
/* We can flip directly to the main surface (full screen window without clips) */
wl_surface_attach(xwl_window->surface, buffer, 0, 0);
if (!xwl_present_window->frame_timer ||
xwl_present_window->frame_timer_firing) {
/* Realign timer */
xwl_present_window->frame_timer_firing = FALSE;
xwl_present_reset_timer(xwl_present_window);
}
if (!xwl_present_window->frame_callback) {
xwl_present_window->frame_callback = wl_surface_frame(xwl_window->surface);
wl_callback_add_listener(xwl_present_window->frame_callback,
......@@ -494,35 +491,51 @@ xwl_present_flip(WindowPtr present_window,
xwl_present_window);
}
/* Realign timer */
xwl_present_window->frame_timer_firing = FALSE;
xwl_present_reset_timer(xwl_present_window);
wl_surface_damage(xwl_window->surface, 0, 0,
damage_box->x2 - damage_box->x1,
damage_box->y2 - damage_box->y1);
wl_surface_commit(xwl_window->surface);
xwl_present_window->sync_callback = wl_display_sync(xwl_window->xwl_screen->display);
if (!sync_flip) {
xwl_present_window->sync_callback =
wl_display_sync(xwl_window->xwl_screen->display);
wl_callback_add_listener(xwl_present_window->sync_callback,
&xwl_present_sync_listener,
event);
}
wl_display_flush(xwl_window->xwl_screen->display);
xwl_window->present_flipped = TRUE;
return TRUE;
}
static void
xwl_present_flips_stop(WindowPtr window)
{
struct xwl_window *xwl_window = xwl_window_from_window(window);
struct xwl_present_window *xwl_present_window = xwl_present_window_priv(window);
if (!xwl_window)
return;
/* Change back to the fast refresh rate */
xwl_present_reset_timer(xwl_present_window);
}
assert(xwl_window->present_window == window);
void
xwl_present_unrealize_window(WindowPtr window)
{
struct xwl_present_window *xwl_present_window = xwl_present_window_priv(window);
xwl_window->present_window = NULL;
if (!xwl_present_window || !xwl_present_window->frame_callback)
return;
/* Change back to the fast refresh rate */
/* The pending frame callback may never be called, so drop it and shorten
* the frame timer interval.
*/
wl_callback_destroy(xwl_present_window->frame_callback);
xwl_present_window->frame_callback = NULL;
xwl_present_reset_timer(xwl_present_window);
}
......
......@@ -370,6 +370,18 @@ damage_report(DamagePtr pDamage, RegionPtr pRegion, void *data)
struct xwl_window *xwl_window = data;
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
#ifdef GLAMOR_HAS_GBM
if (xwl_window->present_flipped) {
/* This damage is from a Present flip, which already committed a new
* buffer for the surface, so we don't need to do anything in response
*/
RegionEmpty(DamageRegion(pDamage));
xorg_list_del(&xwl_window->link_damage);
xwl_window->present_flipped = FALSE;
return;
}
#endif
xorg_list_add(&xwl_window->link_damage, &xwl_screen->damage_window_list);
}
......@@ -597,6 +609,11 @@ xwl_unrealize_window(WindowPtr window)
xwl_screen->UnrealizeWindow = screen->UnrealizeWindow;
screen->UnrealizeWindow = xwl_unrealize_window;
#ifdef GLAMOR_HAS_GBM
if (xwl_screen->present)
xwl_present_unrealize_window(window);
#endif
xwl_window = xwl_window_get(window);
if (!xwl_window)
return ret;
......@@ -721,11 +738,6 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen)
xorg_list_for_each_entry_safe(xwl_window, next_xwl_window,
&xwl_screen->damage_window_list, link_damage) {
#ifdef GLAMOR_HAS_GBM
/* Present on the main surface. So don't commit here as well. */
if (xwl_window->present_window)
continue;
#endif
/* If we're waiting on a frame callback from the server,
* don't attach a new buffer. */
if (xwl_window->frame_callback)
......
......@@ -182,12 +182,15 @@ struct xwl_window {
struct xorg_list link_damage;
struct wl_callback *frame_callback;
Bool allow_commits;
WindowPtr present_window;
#ifdef GLAMOR_HAS_GBM
Bool present_flipped;
#endif
};
#ifdef GLAMOR_HAS_GBM
struct xwl_present_window {
struct xwl_screen *xwl_screen;
struct xwl_present_event *sync_flip;
WindowPtr window;
struct xorg_list link;
......@@ -451,6 +454,7 @@ void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen);
#ifdef GLAMOR_HAS_GBM
Bool xwl_present_init(ScreenPtr screen);
void xwl_present_cleanup(WindowPtr window);
void xwl_present_unrealize_window(WindowPtr window);
#endif /* GLAMOR_HAS_GBM */
#ifdef XV
......
......@@ -62,9 +62,10 @@ generated_gl_thunks.ic: $(srcdir)/gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/gl.xml
generated_gl_thunks.def: $(srcdir)/gen_gl_wrappers.py $(KHRONOS_SPEC_DIR)/gl.xml $(KHRONOS_SPEC_DIR)/reg.py
$(AM_V_GEN)PYTHONPATH=$(KHRONOS_SPEC_DIR) $(PYTHON3) $(srcdir)/gen_gl_wrappers.py -registry $(KHRONOS_SPEC_DIR)/gl.xml -thunkdefs $(GENGLWRAPPERSOPTS) -outfile $@
endif
BUILT_SOURCES = generated_gl_shim.ic generated_gl_thunks.ic generated_gl_thunks.def generated_wgl_wrappers.ic
CLEANFILES = $(BUILT_SOURCES)
endif
EXTRA_DIST = gen_gl_wrappers.py