Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • xorg/xserver
  • avolkov/xserver
  • keithp/xserver
  • aplattner/xserver
  • ajax/xserver
  • ofourdan/xserver
  • anholt/xserver
  • abono/xserver
  • airlied/xserver
  • romangg/xserver
  • ross/xserver
  • mupuf/xserver
  • jturney/xserver
  • CendioOssman/xserver
  • kamarul6401/xserver
  • daenzer/xserver
  • afett/xserver
  • coypoop/xserver
  • 3v1n0/xserver
  • llandwerlin/xserver
  • alanc/xserver
  • lyudess/xserver
  • twaik/xserver
  • shadeslayer/xserver
  • djlucas/xserver
  • aditj/xserver
  • dbn/xserver
  • awilfox/xserver
  • rmader/xserver
  • peterh/xserver
  • dk/xserver
  • dslater38/xserver
  • yshui/xserver
  • PaulKocialkowski/xserver
  • dixler/xserver
  • bentiss/xserver
  • mbiebl/xserver
  • rarbab/xserver
  • causztic/xserver
  • agoins/xserver
  • kbrenneman/xserver
  • Hi-Angel/xserver
  • mlankhorst/xserver
  • rgfernandes/xserver
  • topimiettinen/xserver
  • bphaslett/xserver
  • adamjrichter/xserver
  • karolherbst/xserver
  • carlosg/xserver
  • jwrdegoede/xserver
  • mattrope/xserver
  • sthibaul/xserver
  • J-Bu/xserver
  • nacho.resa/xserver
  • emersion/xserver
  • xexaxo/xserver
  • 1480c1/xserver
  • knisht/xserver
  • mattst88/xserver
  • goosen78/xserver
  • zubzub/xserver
  • vsyrjala/xserver
  • gerddie/xserver
  • JeffyCN/xserver
  • gtrentalancia/xserver
  • lostgoat/xserver
  • headrush/xserver
  • jadahl/xserver
  • webi123/xserver
  • zeising/xserver
  • marv/xserver
  • puleglot/xserver
  • zwenna/xserver
  • TAAPArthur/xserver
  • doraskayo/xserver
  • maos20008/xserver
  • tjbp/xserver
  • pq/xserver
  • yarivb/xserver
  • miztake/xserver
  • lynxeye/xserver
  • zboszor/xserver
  • kwg/xserver
  • Gorg/xserver
  • lkundrak/xserver
  • justazarsky/xserver
  • HermannSW/xserver
  • E5ten/xserver
  • bbrezillon/xserver
  • manu/xserver
  • lucyllewy/xserver
  • marvinjr35/xserver
  • jbeich/xserver
  • dirbaio/xserver
  • strassek/xserver
  • mntmn/xserver
  • uvas/xserver
  • azhadchenko/xserver
  • anarsoul/xserver
  • stapelberg/xserver
  • peigongdsd/xserver
  • sjoerd/xserver
  • Ma/xserver
  • mherrb/xserver
  • pichika/xserver
  • qarmin/xserver
  • cooperch/xserver
  • davidriley/xserver
  • lucmann/xserver
  • chema/xserver
  • whot/xserver
  • xdandys/xserver
  • Spintzyk/xserver
  • mikeroyal/xserver
  • ydirson/xserver
  • SimonPilkington/xserver
  • daniels/xserver
  • andrebsguedes/xserver
  • chenhuacai/xserver
  • Vivek/xserver
  • meMuszr/xserver
  • MisterDA/xserver
  • linkmauve/xserver
  • starnight/xserver
  • ekurzinger/xserver
  • DPA/xserver
  • hmazlan/xserver
  • alagner/xserver
  • tagr/xserver
  • alex-tu-cc/xserver
  • kaniini/xserver
  • p12tic/xserver
  • valpackett/xserver
  • Kishore409/xserver
  • bernhardu/xserver
  • kaichuan.hsieh/xserver
  • icenowy/xserver
  • rilian-la-te/xserver
  • smelenius/xserver
  • vfjpl/xserver
  • mvlad/xserver
  • vliaskov/xserver
  • hitong602/xserver
  • haagch/xserver
  • freemangordon/xserver
  • tmlind/xserver
  • vitoux.pascal/xserver
  • luporl/xserver
  • hassoon1986/xserver
  • chengbo7135/xserver
  • sri-ka1ki/xserver
  • kaocher82/xserver
  • heymiaoO/xserver
  • xry111/xserver
  • jcristau/xserver
  • lanodan/xserver
  • jcourreges/xserver
  • dottedmag/xserver
  • jeremyhu/xserver
  • jcherry/xserver
  • Zamundaaa/xserver
  • gsittyz/xserver
  • OlCe/xserver
  • manuelcrack642/xserver
  • kupper.pa/xserver
  • ZhiJie.Zhang/xserver
  • Michaelypk/xserver
  • msizanoen1/xserver
  • andreyknyazev077/xserver
  • christian-rauch/xserver
  • karlosrangel337/xserver
  • niveditharau/xserver
  • antonovitch/xserver
  • galaxytgtabiday/xserver
  • ryanneph/xserver
  • ismailsiege/xserver
  • orbea/xserver
  • FeepingCreature/xserver
  • ydc-dadada/xserver
  • davidedmundson/xserver
  • arichardson/xserver
  • 1740301466jxz/xserver
  • DemiMarie/xserver
  • kennylevinsen/xserver
  • mrisaacb/xserver
  • robclark/xserver
  • JoseExposito/xserver
  • refi_64/xserver
  • kleinerm/xserver
  • Acidburn0zzz/xserver
  • vinilokorlok/xserver
  • cubanismo/xserver
  • n3rdopolis/xserver
  • mwyraz/xserver
  • halfline/xserver
  • cpmichael/modesetting
  • sherrodejjohnson/xserver
  • eschwartz/xserver
  • oreaus/xserver
  • jocelyn/xserver
  • ernstp/xserver
  • LickmeDown/xserver
  • Daasin/xserver
  • huxd1532/xserver
  • cgzones/xserver
  • davidre/xserver
  • jsg/xserver
  • zagursky/xserver
  • thesamesam/xserver
  • ashafer/xserver
  • dengbo/xserver
  • josch/xserver
  • denisfa/xserver
  • benpicco/xserver
  • Tuetuopay/xserver
  • tholin/xserver
  • tzimmermann/xserver
  • Sjecai2/xserver
  • tintou/xserver
  • zaps166/xserver
  • schreibemirhalt/xserver
  • tomty89/xserver
  • contactshashanksharma/xserver-fork-shashank
  • os369510/xserver
  • liyi42/xserver
  • Kyawswat/xserver
  • psyruss85/xserver
  • akihiko.odaki/xserver
  • StarsGreen/xserver
  • klniu/xserver
  • pekdon/xserver
  • pkubaj/xserver
  • kerneltoast/xserver
  • wengxt/xserver
  • vanvugt/xserver
  • cbur201592/xserver
  • bkylerussell/xserver
  • wujiangGitHub/xserver
  • frog/xserver
  • bafanahub/xserver
  • Ivaniku/x-taylan
  • bigon/xserver
  • jrtc27/xserver
  • djacewicz/xserver
  • kylin0061/xserver
  • Fatton1/xserver
  • gmbr3/xserver
  • devin11911191/xserver
  • guillem/xserver
  • mahkoh/xserver
  • acelan/xserver
  • dkorkmazturk/xserver
  • olv/xserver
  • SpikyCaterpillar1/xserver
  • lihongtao/xserver
  • luke-jr/xserver
  • karamjameelmoore/xserver
  • mehdigh419/xserver
  • wiz/xserver
  • ecurtin/xserver
  • muesli4/xserver
  • iv-m/xserver
  • ForTheReallys/xserver
  • BBaoVanC/xserver
  • ccullumbine2018/xserver
  • mgorse1/xserver
  • road2react/xserver
  • mwei/xserver
  • Rui511/xserver
  • ThatMG393/xserver
  • haihao/xserver
  • ipominov/xserver
  • tsutsui/xserver
  • fweimer/xserver
  • gilvbp/xserver
  • themaister/xserver
  • bbeckett/xserver
  • TMR5454/xserver
  • erwinou/xserver
  • aarondill/xserver
  • peng.jin/xserver
  • russellcnv/xserver
  • yangxiaojuan-loongson/xserver
  • LiChenG-P/xserver
  • looi/xserver
  • NSUTanghaixiang/xserver
  • XDXTHX/xserver
  • City-busz/xserver
  • arrowd/xserver
  • zzyiwei/xserver
  • dongwonk/xserver
  • EXtremeExploit/xserver
  • luyn/xserver
  • hexiaodong/xserver
  • sewn/xserver
  • cl91/xserver
  • rnpnr/xserver
  • adamdruppe/xserver
  • RyzenDew/xserver
  • jexposit/xserver
  • svalaskevicius/xserver
  • floppym/xserver
  • metux/xserver
  • YusufKhan-gamedev/xserver
  • Drakulix/xserver
  • wjp/xserver
  • dawnhan/xserver
  • noblock/xserver
  • zzag/xserver
  • catap/xserver
  • trevdave/xserver
  • ids1024/xserver
  • gabifalk/xserver
  • Emantor/xserver
  • sknsean/xserver
  • hongaoo/xserver
  • penguin42/xserver
  • heitbaum/xserver
  • fvalasiad/xserver
  • AkiSakurai/xserver
  • chenx_dust/xserver
  • jmonteiro/xserver
  • gldrk/xserver
  • dougg3/xserver
  • pepp/xserver
  • Julia/xserver
  • nathankidd/xserver
  • jannau/xserver
  • zhangyaning/xserver
  • xinbowang/xserver
  • sergiomb/xserver
  • andy-zetier/xserver
  • jayantpranjal0/xserver
  • zzxyb/xserver
  • dkg/xserver
  • GermanAizek/xserver
  • dougvj/xserver
  • volkanorhan/xserver
  • rbernon/xserver
  • matt335672/xserver
  • gfxstrand/xorg-xserver
  • nicolas-guichard/xserver
  • rc_05/xserver
  • alex.kanavin/xserver
344 results
Show changes
Commits on Source (6)
...@@ -423,7 +423,8 @@ glamor_debug_output_callback(GLenum source, ...@@ -423,7 +423,8 @@ glamor_debug_output_callback(GLenum source,
static void static void
glamor_setup_debug_output(ScreenPtr screen) glamor_setup_debug_output(ScreenPtr screen)
{ {
if (!epoxy_has_gl_extension("GL_ARB_debug_output")) if (!epoxy_has_gl_extension("GL_KHR_debug") &&
!epoxy_has_gl_extension("GL_ARB_debug_output"))
return; return;
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
......
...@@ -27,8 +27,10 @@ ...@@ -27,8 +27,10 @@
static const glamor_facet glamor_facet_polyfillrect_130 = { static const glamor_facet glamor_facet_polyfillrect_130 = {
.name = "poly_fill_rect", .name = "poly_fill_rect",
.version = 130, .version = 130,
.vs_vars = "attribute vec4 primitive;\n", .source_name = "size",
.vs_exec = (" vec2 pos = primitive.zw * vec2(gl_VertexID&1, (gl_VertexID&2)>>1);\n" .vs_vars = "attribute vec2 primitive;\n"
"attribute vec2 size;\n",
.vs_exec = (" vec2 pos = size * vec2(gl_VertexID&1, (gl_VertexID&2)>>1);\n"
GLAMOR_POS(gl_Position, (primitive.xy + pos))), GLAMOR_POS(gl_Position, (primitive.xy + pos))),
}; };
...@@ -81,9 +83,14 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable, ...@@ -81,9 +83,14 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
glEnableVertexAttribArray(GLAMOR_VERTEX_POS); glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
glVertexAttribDivisor(GLAMOR_VERTEX_POS, 1); glVertexAttribDivisor(GLAMOR_VERTEX_POS, 1);
glVertexAttribPointer(GLAMOR_VERTEX_POS, 4, GL_SHORT, GL_FALSE, glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_SHORT, GL_FALSE,
4 * sizeof (short), vbo_offset); 4 * sizeof (short), vbo_offset);
glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 1);
glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_UNSIGNED_SHORT, GL_FALSE,
4 * sizeof (short), vbo_offset + 2 * sizeof (short));
memcpy(v, prect, nrect * sizeof (xRectangle)); memcpy(v, prect, nrect * sizeof (xRectangle));
glamor_put_vbo_space(screen); glamor_put_vbo_space(screen);
...@@ -156,8 +163,11 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable, ...@@ -156,8 +163,11 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable,
bail: bail:
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
if (glamor_priv->glsl_version >= 130) if (glamor_priv->glsl_version >= 130) {
glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 0);
glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0); glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0);
}
glDisableVertexAttribArray(GLAMOR_VERTEX_POS); glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
return ret; return ret;
......
...@@ -48,16 +48,13 @@ present_execute_wait(present_vblank_ptr vblank, uint64_t crtc_msc) ...@@ -48,16 +48,13 @@ present_execute_wait(present_vblank_ptr vblank, uint64_t crtc_msc)
ScreenPtr screen = window->drawable.pScreen; ScreenPtr screen = window->drawable.pScreen;
present_screen_priv_ptr screen_priv = present_screen_priv(screen); present_screen_priv_ptr screen_priv = present_screen_priv(screen);
if (vblank->requeue) { /* We may have to requeue for the next MSC if check_flip_window prevented
vblank->requeue = FALSE; * using a flip.
if (msc_is_after(vblank->target_msc, crtc_msc) && */
Success == screen_priv->queue_vblank(screen, if (vblank->exec_msc == crtc_msc + 1 &&
window, screen_priv->queue_vblank(screen, window, vblank->crtc, vblank->event_id,
vblank->crtc, vblank->exec_msc) == Success)
vblank->event_id, return TRUE;
vblank->target_msc))
return TRUE;
}
if (vblank->wait_fence) { if (vblank->wait_fence) {
if (!present_fence_check_triggered(vblank->wait_fence)) { if (!present_fence_check_triggered(vblank->wait_fence)) {
...@@ -75,13 +72,13 @@ present_execute_copy(present_vblank_ptr vblank, uint64_t crtc_msc) ...@@ -75,13 +72,13 @@ present_execute_copy(present_vblank_ptr vblank, uint64_t crtc_msc)
ScreenPtr screen = window->drawable.pScreen; ScreenPtr screen = window->drawable.pScreen;
present_screen_priv_ptr screen_priv = present_screen_priv(screen); present_screen_priv_ptr screen_priv = present_screen_priv(screen);
/* If present_flip failed, we may have to requeue for the target MSC */ /* If present_flip failed, we may have to requeue for the next MSC */
if (vblank->target_msc == crtc_msc + 1 && if (vblank->exec_msc == crtc_msc + 1 &&
Success == screen_priv->queue_vblank(screen, Success == screen_priv->queue_vblank(screen,
window, window,
vblank->crtc, vblank->crtc,
vblank->event_id, vblank->event_id,
vblank->target_msc)) { vblank->exec_msc)) {
vblank->queued = TRUE; vblank->queued = TRUE;
return; return;
} }
......
...@@ -70,14 +70,14 @@ struct present_vblank { ...@@ -70,14 +70,14 @@ struct present_vblank {
int16_t y_off; int16_t y_off;
CARD16 kind; CARD16 kind;
uint64_t event_id; uint64_t event_id;
uint64_t target_msc; uint64_t target_msc; /* target MSC when present should complete */
uint64_t exec_msc; /* MSC at which present can be executed */
uint64_t msc_offset; uint64_t msc_offset;
present_fence_ptr idle_fence; present_fence_ptr idle_fence;
present_fence_ptr wait_fence; present_fence_ptr wait_fence;
present_notify_ptr notifies; present_notify_ptr notifies;
int num_notifies; int num_notifies;
Bool queued; /* on present_exec_queue */ Bool queued; /* on present_exec_queue */
Bool requeue; /* on queue, but target_msc has changed */
Bool flip; /* planning on using flip */ Bool flip; /* planning on using flip */
Bool flip_ready; /* wants to flip, but waiting for previous flip or unflip */ Bool flip_ready; /* wants to flip, but waiting for previous flip or unflip */
Bool flip_idler; /* driver explicitly permitted idling */ Bool flip_idler; /* driver explicitly permitted idling */
...@@ -469,7 +469,7 @@ present_vblank_create(WindowPtr window, ...@@ -469,7 +469,7 @@ present_vblank_create(WindowPtr window,
const uint32_t *capabilities, const uint32_t *capabilities,
present_notify_ptr notifies, present_notify_ptr notifies,
int num_notifies, int num_notifies,
uint64_t *target_msc, uint64_t target_msc,
uint64_t crtc_msc); uint64_t crtc_msc);
void void
......
...@@ -335,8 +335,8 @@ present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) ...@@ -335,8 +335,8 @@ present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
ScreenPtr screen = vblank->screen; ScreenPtr screen = vblank->screen;
present_screen_priv_ptr screen_priv = present_screen_priv(screen); present_screen_priv_ptr screen_priv = present_screen_priv(screen);
DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
vblank->event_id, vblank, vblank->target_msc, vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc,
vblank->pixmap ? vblank->pixmap->drawable.id : 0, vblank->pixmap ? vblank->pixmap->drawable.id : 0,
vblank->window ? vblank->window->drawable.id : 0)); vblank->window ? vblank->window->drawable.id : 0));
...@@ -456,7 +456,7 @@ present_check_flip_window (WindowPtr window) ...@@ -456,7 +456,7 @@ present_check_flip_window (WindowPtr window)
vblank->flip = FALSE; vblank->flip = FALSE;
vblank->reason = reason; vblank->reason = reason;
if (vblank->sync_flip) if (vblank->sync_flip)
vblank->requeue = TRUE; vblank->exec_msc = vblank->target_msc;
} }
} }
} }
...@@ -582,6 +582,7 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) ...@@ -582,6 +582,7 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
*/ */
screen_priv->flip_pending = NULL; screen_priv->flip_pending = NULL;
vblank->flip = FALSE; vblank->flip = FALSE;
vblank->exec_msc = vblank->target_msc;
} }
DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id)); vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id));
...@@ -732,16 +733,19 @@ present_scmd_pixmap(WindowPtr window, ...@@ -732,16 +733,19 @@ present_scmd_pixmap(WindowPtr window,
screen_priv->info ? &screen_priv->info->capabilities : NULL, screen_priv->info ? &screen_priv->info->capabilities : NULL,
notifies, notifies,
num_notifies, num_notifies,
&target_msc, target_msc,
crtc_msc); crtc_msc);
if (!vblank) if (!vblank)
return BadAlloc; return BadAlloc;
if (vblank->flip && vblank->sync_flip)
vblank->exec_msc--;
xorg_list_append(&vblank->event_queue, &present_exec_queue); xorg_list_append(&vblank->event_queue, &present_exec_queue);
vblank->queued = TRUE; vblank->queued = TRUE;
if (msc_is_after(target_msc, crtc_msc)) { if (msc_is_after(vblank->exec_msc, crtc_msc)) {
ret = present_queue_vblank(screen, window, target_crtc, vblank->event_id, target_msc); ret = present_queue_vblank(screen, window, target_crtc, vblank->event_id, vblank->exec_msc);
if (ret == Success) if (ret == Success)
return Success; return Success;
......
...@@ -57,7 +57,7 @@ present_vblank_create(WindowPtr window, ...@@ -57,7 +57,7 @@ present_vblank_create(WindowPtr window,
const uint32_t *capabilities, const uint32_t *capabilities,
present_notify_ptr notifies, present_notify_ptr notifies,
int num_notifies, int num_notifies,
uint64_t *target_msc, uint64_t target_msc,
uint64_t crtc_msc) uint64_t crtc_msc)
{ {
ScreenPtr screen = window->drawable.pScreen; ScreenPtr screen = window->drawable.pScreen;
...@@ -100,7 +100,8 @@ present_vblank_create(WindowPtr window, ...@@ -100,7 +100,8 @@ present_vblank_create(WindowPtr window,
vblank->x_off = x_off; vblank->x_off = x_off;
vblank->y_off = y_off; vblank->y_off = y_off;
vblank->target_msc = *target_msc; vblank->target_msc = target_msc;
vblank->exec_msc = target_msc;
vblank->crtc = target_crtc; vblank->crtc = target_crtc;
vblank->msc_offset = window_priv->msc_offset; vblank->msc_offset = window_priv->msc_offset;
vblank->notifies = notifies; vblank->notifies = notifies;
...@@ -111,12 +112,11 @@ present_vblank_create(WindowPtr window, ...@@ -111,12 +112,11 @@ present_vblank_create(WindowPtr window,
if (pixmap != NULL && if (pixmap != NULL &&
!(options & PresentOptionCopy) && !(options & PresentOptionCopy) &&
capabilities) { capabilities) {
if (msc_is_after(*target_msc, crtc_msc) && if (msc_is_after(target_msc, crtc_msc) &&
screen_priv->check_flip (target_crtc, window, pixmap, TRUE, valid, x_off, y_off, &reason)) screen_priv->check_flip (target_crtc, window, pixmap, TRUE, valid, x_off, y_off, &reason))
{ {
vblank->flip = TRUE; vblank->flip = TRUE;
vblank->sync_flip = TRUE; vblank->sync_flip = TRUE;
*target_msc = *target_msc - 1;
} else if ((*capabilities & PresentCapabilityAsync) && } else if ((*capabilities & PresentCapabilityAsync) &&
screen_priv->check_flip (target_crtc, window, pixmap, FALSE, valid, x_off, y_off, &reason)) screen_priv->check_flip (target_crtc, window, pixmap, FALSE, valid, x_off, y_off, &reason))
{ {
...@@ -139,7 +139,7 @@ present_vblank_create(WindowPtr window, ...@@ -139,7 +139,7 @@ present_vblank_create(WindowPtr window,
if (pixmap) if (pixmap)
DebugPresent(("q %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p) flip %d vsync %d serial %d\n", DebugPresent(("q %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p) flip %d vsync %d serial %d\n",
vblank->event_id, vblank, *target_msc, vblank->event_id, vblank, target_msc,
vblank->pixmap->drawable.id, vblank->window->drawable.id, vblank->pixmap->drawable.id, vblank->window->drawable.id,
target_crtc, vblank->flip, vblank->sync_flip, vblank->serial)); target_crtc, vblank->flip, vblank->sync_flip, vblank->serial));
return vblank; return vblank;
...@@ -153,8 +153,8 @@ no_mem: ...@@ -153,8 +153,8 @@ no_mem:
void void
present_vblank_scrap(present_vblank_ptr vblank) present_vblank_scrap(present_vblank_ptr vblank)
{ {
DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p)\n", DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p)\n",
vblank->event_id, vblank, vblank->target_msc, vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc,
vblank->pixmap->drawable.id, vblank->window->drawable.id, vblank->pixmap->drawable.id, vblank->window->drawable.id,
vblank->crtc)); vblank->crtc));
...@@ -175,8 +175,8 @@ present_vblank_destroy(present_vblank_ptr vblank) ...@@ -175,8 +175,8 @@ present_vblank_destroy(present_vblank_ptr vblank)
/* Also make sure vblank is removed from event queue (wnmd) */ /* Also make sure vblank is removed from event queue (wnmd) */
xorg_list_del(&vblank->event_queue); xorg_list_del(&vblank->event_queue);
DebugPresent(("\td %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", DebugPresent(("\td %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
vblank->event_id, vblank, vblank->target_msc, vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc,
vblank->pixmap ? vblank->pixmap->drawable.id : 0, vblank->pixmap ? vblank->pixmap->drawable.id : 0,
vblank->window ? vblank->window->drawable.id : 0)); vblank->window ? vblank->window->drawable.id : 0));
......
...@@ -42,6 +42,17 @@ ...@@ -42,6 +42,17 @@
static void static void
present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc); present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc);
static int
present_wnmd_queue_vblank(ScreenPtr screen,
WindowPtr window,
RRCrtcPtr crtc,
uint64_t event_id,
uint64_t msc)
{
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id, msc);
}
static void static void
present_wnmd_create_event_id(present_window_priv_ptr window_priv, present_vblank_ptr vblank) present_wnmd_create_event_id(present_window_priv_ptr window_priv, present_vblank_ptr vblank)
{ {
...@@ -158,8 +169,8 @@ present_wnmd_flip_notify_vblank(present_vblank_ptr vblank, uint64_t ust, uint64_ ...@@ -158,8 +169,8 @@ present_wnmd_flip_notify_vblank(present_vblank_ptr vblank, uint64_t ust, uint64_
WindowPtr window = vblank->window; WindowPtr window = vblank->window;
present_window_priv_ptr window_priv = present_window_priv(window); present_window_priv_ptr window_priv = present_window_priv(window);
DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
vblank->event_id, vblank, vblank->target_msc, vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc,
vblank->pixmap ? vblank->pixmap->drawable.id : 0, vblank->pixmap ? vblank->pixmap->drawable.id : 0,
vblank->window ? vblank->window->drawable.id : 0)); vblank->window ? vblank->window->drawable.id : 0));
...@@ -211,6 +222,14 @@ present_wnmd_event_notify(WindowPtr window, uint64_t event_id, uint64_t ust, uin ...@@ -211,6 +222,14 @@ present_wnmd_event_notify(WindowPtr window, uint64_t event_id, uint64_t ust, uin
return; return;
} }
} }
/* Copies which were executed but need their completion event sent */
xorg_list_for_each_entry(vblank, &window_priv->idle_queue, event_queue) {
if (vblank->event_id == event_id) {
present_execute_post(vblank, ust, msc);
return;
}
}
} }
void void
...@@ -358,8 +377,6 @@ present_wnmd_check_flip_window (WindowPtr window) ...@@ -358,8 +377,6 @@ present_wnmd_check_flip_window (WindowPtr window)
vblank->sync_flip, vblank->valid, 0, 0, &reason)) { vblank->sync_flip, vblank->valid, 0, 0, &reason)) {
vblank->flip = FALSE; vblank->flip = FALSE;
vblank->reason = reason; vblank->reason = reason;
if (vblank->sync_flip)
vblank->requeue = TRUE;
} }
} }
} }
...@@ -459,6 +476,7 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) ...@@ -459,6 +476,7 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
vblank->queued = FALSE; vblank->queued = FALSE;
if (vblank->pixmap && vblank->window) { if (vblank->pixmap && vblank->window) {
ScreenPtr screen = window->drawable.pScreen;
if (vblank->flip) { if (vblank->flip) {
RegionPtr damage; RegionPtr damage;
...@@ -484,7 +502,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) ...@@ -484,7 +502,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
// ask the driver // ask the driver
if (present_wnmd_flip(vblank->window, vblank->crtc, vblank->event_id, if (present_wnmd_flip(vblank->window, vblank->crtc, vblank->event_id,
vblank->target_msc, vblank->pixmap, vblank->sync_flip, damage)) { vblank->target_msc, vblank->pixmap, vblank->sync_flip, damage)) {
ScreenPtr screen = window->drawable.pScreen;
WindowPtr toplvl_window = present_wnmd_toplvl_pixmap_window(vblank->window); WindowPtr toplvl_window = present_wnmd_toplvl_pixmap_window(vblank->window);
PixmapPtr old_pixmap = screen->GetWindowPixmap(window); PixmapPtr old_pixmap = screen->GetWindowPixmap(window);
...@@ -514,9 +531,12 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) ...@@ -514,9 +531,12 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
present_wnmd_cancel_flip(window); present_wnmd_cancel_flip(window);
present_execute_copy(vblank, crtc_msc); present_execute_copy(vblank, crtc_msc);
assert(!vblank->queued);
if (vblank->queued) { if (present_wnmd_queue_vblank(screen, window, vblank->crtc,
xorg_list_add(&vblank->event_queue, &window_priv->exec_queue); vblank->event_id, crtc_msc + 1)
== Success) {
xorg_list_add(&vblank->event_queue, &window_priv->idle_queue);
xorg_list_append(&vblank->window_list, &window_priv->vblank); xorg_list_append(&vblank->window_list, &window_priv->vblank);
return; return;
...@@ -526,17 +546,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) ...@@ -526,17 +546,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
present_execute_post(vblank, ust, crtc_msc); present_execute_post(vblank, ust, crtc_msc);
} }
static int
present_wnmd_queue_vblank(ScreenPtr screen,
WindowPtr window,
RRCrtcPtr crtc,
uint64_t event_id,
uint64_t msc)
{
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id, msc);
}
static void static void
present_wnmd_update_window_crtc(WindowPtr window, RRCrtcPtr crtc, uint64_t new_msc) present_wnmd_update_window_crtc(WindowPtr window, RRCrtcPtr crtc, uint64_t new_msc)
{ {
...@@ -645,15 +654,20 @@ present_wnmd_pixmap(WindowPtr window, ...@@ -645,15 +654,20 @@ present_wnmd_pixmap(WindowPtr window,
&screen_priv->wnmd_info->capabilities, &screen_priv->wnmd_info->capabilities,
notifies, notifies,
num_notifies, num_notifies,
&target_msc, target_msc,
crtc_msc); crtc_msc);
if (!vblank) if (!vblank)
return BadAlloc; return BadAlloc;
/* WNMD presentations always complete (at least) one frame after they
* are executed
*/
vblank->exec_msc = vblank->target_msc - 1;
xorg_list_append(&vblank->event_queue, &window_priv->exec_queue); xorg_list_append(&vblank->event_queue, &window_priv->exec_queue);
vblank->queued = TRUE; vblank->queued = TRUE;
if (crtc_msc < target_msc) { if (crtc_msc < vblank->exec_msc) {
if (present_wnmd_queue_vblank(screen, window, target_crtc, vblank->event_id, target_msc) == Success) { if (present_wnmd_queue_vblank(screen, window, target_crtc, vblank->event_id, vblank->exec_msc) == Success) {
return Success; return Success;
} }
DebugPresent(("present_queue_vblank failed\n")); DebugPresent(("present_queue_vblank failed\n"));
......