[01:23] RAOF: Surprisingly, and ignoring the tearing, I could actually *feel* the desktop was more responsive with the PPA intel driver. I suspect that would mostly be due to double vs triple buffering... [01:23] Plausibly. [01:24] I always thought it was imperceptible before now [01:25] We're ridiculously sensitive to latency, sometimes. [01:32] robert_ancell: did you get anywhere with that MP? I fixed the failing CI :-/ [01:32] thomi, what's the link? [01:33] thomi, 'add-mir-stress'? === kode54_ is now known as kode54 [01:35] thomi, did the client API not get fixed for leaking descriptors yet? [01:37] robert_ancell: https://code.launchpad.net/~thomir/mir/add-mir-stress/+merge/167661 [01:37] robert_ancell: it was fixed, but then it broke again [01:38] robert_ancell: so I want to get this as part of a CI run, to apply some pressure to not have it break again in the future [01:38] yep [01:38] sorry for the delay - I did a dist upgrade and now saucy unity crashes every time I click anywhere in firefox :-/) [01:40] unity in saucy also went super-unstable when switching to saucy [01:45] robert_ancell: thanks for the review. I like your package name better, so I'll chaneg it & then hit the button === harrow` is now known as harrow [05:08] thomi, with one last merge I think the lightdm tests (i.e. make check) should finally run on a server - what do we do to enable them in Jenkins? [05:29] robert_ancell: just make them run as part of the package build [05:29] something about roverriding dh_auto_test ? [05:30] override_dh_auto_test: [05:30] in debian/rules [05:30] to run your tests [05:30] and done! [06:52] thomi, oh duh. Cheers! === mmrazik is now known as mmrazik|afk === mmrazik|afk is now known as mmrazik === mmrazik is now known as mmrazik|ofp [08:44] RAOF: hi === mmrazik|ofp is now known as mmrazik [09:12] pete-woods, hey, did the LightDM test changes make sense? Do you want to have a call? [09:12] robert_ancell: I really appreciate you putting the effort in to help me here! [09:12] I was expecting you to be in bed around now, though! [09:13] I was going to stay up late tonight [09:13] pete-woods, I stay up late on Thursdays otherwise I never have overlap with you guys over that side [09:14] pete-woods, I'd be interested if there will be possible at some point to remove the mock service code in test-runner.c and replace it with dbusmock. At the time dbusmock didn't exist but I really needed it then [09:14] robert_ancell: could you give me a short while to read the changes - I've not looked at them yet [09:14] np [09:14] yeah, dbusmock is awesome [09:14] I'll be here another 15 mins [09:14] okay [09:14] speed code read! [09:19] okay, cool, that looks like a nice start [09:20] pete-woods, yeah, I hope that shows enough to plug in the other tests [09:21] robert_ancell: if we want to change the users, what do you think we should do there? [09:21] re-write the whole passwd file, etc [09:21] ? [09:22] should the code there be extracted into a new method that blats the passwd file and corresponding extended user info file? [09:22] pete-woods, I'm not sure the case your talking about - you mean having users A B C then replacing them all with D E F? [09:22] so say a user's name changes, or language, or anything like that [09:22] robert_ancell: ^ [09:23] pete-woods, I'd say add a method to test-runner.c to that can modify user information and yeah, replace the passwd file if necessary and update the accounts service API [09:24] robert_ancell, okay cool, I'll have a look at doing that [09:24] as long as you're happy with that sort of change [09:24] I'm really nervous about disrupting as critical a project as LightDM [09:25] I don't want 3 million angry geeks ranting at me! [09:25] :) That's what the tests are for! [09:25] but it's the tests I'm screwing with! [09:25] yeah, you can do fairly radical things with the test-runner because it's only the tests that trigger that that will be affected [09:26] I'll push that MP - I was just keeping it open so you'd notice it [09:26] okay fair enough, if you're happy with me messing with that, I'll re-do the changes [09:26] *tests [09:27] sorry about that - it's always a pain to have to redo [09:27] robert_ancell: there is one thing your runner doesn't catch that I'd like it to [09:27] so the way I structure my dbus tests I make sure you create, destroy, create the service under test multiple times in a single process [09:27] that way DBus gets upset at you if you don't clean up after youself [09:27] i.e. restart accounts service? [09:28] as in repeat the lifecycle of liblightdm's UsersList object [09:29] when it is destroyed it doesn't let go of it's reference to the display proxy [09:29] liblightdm-gobject/user.c [09:29] g_clear_object(&priv->display_manager_proxy); [09:29] inside the finalize method [09:30] pete-woods, oh, that would be done inside the greeter - i.e. new/unref it a whole lot of times [09:30] or create/destroy the greeter object? [09:30] the actual user list object [09:30] that's what I was adding the tests for [09:31] do you think they'll work well if you make a method in the greeter that does that? [09:31] what I'm getting at is that I think that the way the tests are run, it'd be nice if they lived inside a single process [09:32] as that exacerbates resource problems [09:32] Yeah, that's the down-side of the current method [09:33] but, I think it could be changed without affecting your test scripts [09:33] it'd just be the test framework that would change [09:33] The thing is, that liblightdm shouldn't work at all really unless it is set up inside the LightDM environment - so the fact you can use the UserList is a bit of a fluke [09:34] In general it requires the connection to the daemon which is harder to mock [09:34] totally fair [09:34] I just think that you could do all the set-up and destruction without spawning lots of separate instances [09:35] it's always amazing how many things you catch when you force all the tests to run in the same env [09:35] you see how leaky things are (especially with resources) [09:35] either way, we can at least fix the bug, even if we don't have a regression test [09:35] pete-woods, do you mean lightdm_greeter_new multiple times for example? [09:36] (from the same process) [09:36] ping alan_g [09:36] robert_ancell, that would probably do it [09:36] duflu: morning [09:36] alan_g: Evening [09:37] alan_g: What kind of "using directive" did you mean here: https://code.launchpad.net/~vanvugt/mir/move/+merge/162487/comments/358815 [09:37] ? [09:37] robert_ancell: I guess what I mean is do something like call test-runner with a list of all the test scripts, then it would run each of them in the same process [09:37] including all the setup and tear down [09:37] pete-woods, oh, I understand [09:37] pete-woods, yeah, the best you can get is to make a test that does 100 iterations etc [09:37] * alan_g looks [09:38] the downside is it's very hard to link up valgrind etc and analyse the greeter that was run [09:38] robert_ancell: if you ran each of them under a g_test instance you could even get a nice report about which of them failed [09:38] and you get coverage analysis [09:38] duflu: "using DefaultServerConfiguration::set_session_manager;" [09:38] true! [09:39] pete-woods, I'm open to improved tests, I'm just worried about two similar but different test frameworks to support [09:39] robert_ancell: I totally understand, I'm saying we could improve the existing tests here [09:39] I think if we could get dbusmock into the existing tests or share some code it would probably work. But it would be quite some work [09:39] pete-woods, please do! :) [09:39] yes! [09:40] I don't really have time to go crazy, though [09:40] damn full-time job ;) [09:40] pete-woods, you don't need to sleep right? [09:40] robert_ancell: I think some people at canonical don't seem to sleep [09:40] that's been my assumption [09:42] alan_g: Maybe I'm rusty, but I don't see what that solves. It's WindowManager::set_session_manager that is introduced [09:44] duflu: then I probably meant something I didn't say... [09:44] alan_g: OK forget about it for now. I'll ask for clarification later when I repropose [09:44] duflu: https://code.launchpad.net/~vanvugt/mir/move/+merge/162487/comments/358816 [09:45] alan_g: Yeah that change at "195" doesn't exist any more. Someone else already committed the same thing on trunk :) [09:46] * alan_g forgets about it (for now) === mmrazik is now known as mmrazik|lunch === mmrazik|lunch is now known as mmrazik === seb128_ is now known as seb128 === alan_g is now known as alan_g|lunch [12:17] question: how do you: start the mir server, run a mir client and stop it from a tty? (atm i kill it with ssh :P) [12:17] +is it possible to run mir on a vm? [12:30] hikiko: http://unity.ubuntu.com/mir/using_mir_on_pc.html [12:30] i tried this alan_g|lunch but I couldn't switch to other terminals or start the client [12:31] and I had to kill it through ssh [12:33] hmm sorry I wasn't root but still when I run the mir demo client I get seg fault === greyback is now known as greyback|food === alan_g|lunch is now known as alan_g [12:55] hikiko: are you running trunk? [12:55] and is it the client or server that segfaults? [13:05] alan_g, it was the client, now it's ok, I had a 2nd server running in the background that's why [13:05] sorry [13:05] hikiko: so you're OK now? [13:05] yes [13:05] cool [13:05] everything working fine === greyback|food is now known as greyback === seb128_ is now known as seb128 [14:24] alf__: hikiko - I'm currently blocked on CB, is there anything I can lend a hand with? === alan_g is now known as alan_g|tea === alan_g|tea is now known as alan_g [14:34] alan_g: is there something we can do to unblock you? [14:35] alf__: kdub_ is having a look. So probably best not to disrupt what you're doing. === alan_g is now known as alan_g|afk [14:35] alan_g, sorry I just saw it [14:35] what is the cb? === alan_g|afk is now known as alan_g|tea [14:36] hikiko: composition bypass [14:36] sorry if I sound too naive but what is the composition bypass? [14:38] hikiko: it's when a client renders directly to the framebuffer instead of a normal surface [14:39] hikiko: usual scenario for this is when a game goes fullscreen [14:40] so you have to make active the framebuffer (set colorbuffer etc) and then bind? [14:40] hmmm [14:41] well I don't know well the mir codebase but you mean when for example you go to the system compositor, you create a texture with width/height the virtual screen height and you redirect all your rendering to the texture and then you fill the compositors bo with that texture and you render? === alan_g|tea is now known as alan_g [14:42] (i should put some commas on that :p) i hope yuo make sense [14:43] i mean is that a framebuffer? a full screen texture? [14:43] or you refer to something else? [14:43] eg the linux fb0 device or sth else [14:43] hikiko: framebuffer= the block of graphics memory that gets display on the screen by the graphics card [14:44] ok so you don't refer to the FBO in GLES [14:44] hikiko: on android I'm trying to pass out the framebuffer to the client. (But when the client calls eglSwapBuffer the buffer isn't returned to the server.) [14:46] hikiko: what we want is for clients to be able to render directly to screen, instead of on a surface which we then render/composite onto the screen [14:46] so you need to have a shared framebuffer [14:46] and the client to have the full control there [14:46] isn't it? [14:47] I mean the client to have the ability to render directly to the fb [14:47] yes [14:47] and you provide a callback to the client for rendering for example? [14:48] like those in the client library? [14:49] The client renders to the frambuffer, calls next_buffer and the server swaps the FB to the display. (In theory) [14:49] alan_g, is it possible that your framebuffer is empty because you already sent it to the gpu with some make current in the wrong place ? (I guess no but I just say the most obvious mistake I can think of) [14:51] hikiko: when the client calls eglSwapBuffers I expect a call to next_buffer - but that doesn't happen. kdub_ is most familiar with the android blobs and is looking into it... [14:52] next buffer is a mir client isn't it [14:52] yes [14:53] method* [14:53] then how eglSwapBuffers will call a mir method? [14:53] hikiko: I guess my problem is more interesting than yours? [14:54] lol [14:54] ok I don't comfuse you anymore [14:55] hikiko: I don't mind, but I don't want to divert you from more useful work. [14:56] egl is supplied with a bunch of function pointers. One of which leads to next_buffer [14:57] and if a normal buffer is used next_buffer gets called after rendering. [14:58] I didn't know that egl has callbacks, interesting to know [15:03] hello, status, starting to dive into comp bypass, shepherding branches and cleanups too [15:04] status: deciding what to do while kdub_ dives into CB [15:05] * alan_g has discovered that saucy is unstable on his netbook [15:08] alan_g, no exciting news so far, going to tinker with some small test programs for a while to explore what's happening [15:09] status: experimenting with various approaches for providing surface snapshots, leaning towards having a separate thread in mir for this purpose [15:10] kdub_: at least I don't feel I missed something obvious. ;) [15:13] status2: (also for snapshots) working on providing BufferSwapper::compositor_peek() [15:14] alf_, hmm. if the only 'lastposted' buffer is given out to the compositor, how would that work? [15:15] we could retain the reference to the 'lastposted' buffer in the swappers, and then allow 2 threads to compositor_acquire that buffer [15:17] kdub_: yes, we need to keep information about which buffer the compositor has acquired [15:18] i've thought recently that compositor_{acquire,release} and client_{acquire, release} would be better if they were consumer_{} and producer_{} [15:19] kdub_: but we need a separate peek() method that doesn't dequeue the buffer. We don't want snapshots to cause the compositor to drop frames. [15:19] kdub_: I like the idea [15:20] alf_, i'm saying like, if we have a snapshotter and a compositor who both get the same buffer, we would have to wait for them to both release before triggering buffer advancement in the swapper [15:22] it would be cool even if the separate thread was a SnapshottingCompositionStrategy : public CompositingStrategy, then we could use the gpu to copy the buffer into thumbnail-size resolution and use the gpu's capability to scale the image [15:24] kdub_: sure, but we shouldn't allow the snapshotter to make the compositor miss a buffer. If we just have normal acquire/release, then imagine: snapshotter acquires buffer, is done, releases buffer back to client, compositor acquires the next buffer => frame lost [15:25] ah, so the essence of the new function is that compositor_acquire would be required to advance the buffer [15:25] but peek_buffer would not trigger an advance on the return of the buffer it 'peeked at' [15:28] kdub_: right, and of course if a buffer is being peeked at it will not return to the client until it is released by the peeker (is there such a word?) [15:30] kdub_: and the change to producer/consumer make even more sense now that we have another type of consumer (the snapshotter) [15:32] alf_, right, the generic plan sounds good then :) [15:37] kdub_: alf_ do we actually need to hand out the buffer to the snapshotter? Wouldn't ExecuteAroundMethod be a better idiom? [15:44] alan_g: do you mean something like BufferSwapper::with_compositor_buffer_do(std::function const&) ? [15:45] alf_: exactly [15:47] if could also do that on the compositor side, then - at least in theory - both the compositor and the snapshotter could access the buffer concurrently. [15:47] i guess either way, the buffer would be delayed the same potential amount of time [15:47] *if we [15:47] alan_g: At first glance that could work, and I like the idea. Need to think through the locking/delay implications. [15:48] with peek_buffer() it could be concurrent too though [15:48] although i like the idea too [15:49] kdub_: I was thinking the the swapper lost the buffer between the calls? [15:50] right, either way (execute-around or a new method) we'll have to change it so we never loose the reference in the swapper for the compositor buffer [15:50] lose [15:50] kdub_: So, yeah, perhaps we wouldn't need to lock the entire operation and get the best of both worlds. In particular, perhaps do what would be needed to "peek" the buffer, but don't give it out, process it through the callback. [15:52] but I need to think through the details... [15:52] sure, i think both would work, and both would have worst case delay of (compositing-time + snapshotting time) [15:52] but best case delay of max(compositing-time, snapshotting-time) [15:54] agreed [15:56] Morning [15:56] kdub_: alan_g: best case delay from the compositor's perspective is 0 (if snapshotting begins and ends while the compositor doesn't need the buffer), worst case is snapshotting time [15:56] Afternoon [15:57] racarr, you have the mesa 'configure' command handy? my compile can't find a symbol for '_glapi_tls_Dispatch' [15:58] kdub_: do you mean delay as in how much time the buffer is in use? [15:58] right, how long it is in use as a 'consumer' buffer [15:59] kdub_: Uhhhh so I have seen that beore and got it from something weird but the configure command is [15:59] ./configure --disable-gallium-egl --enable-gles1 --enable-gles --with-egl-p\ [15:59] latforms=x11,drm,mir,wayland --enable-gbm --enable-shared-glapi --with-gallium-\ [15:59] drivers=r300,r600 [15:59] kdub_: right, so I guess that's delay from the client's perspective [16:00] alf_: snapshotting shouldn't need to delay compositing (they should both treat the buffer as immutable) [16:00] alan_g: kdub_: yes you are absolutely right, probably time to end my day :) [16:03] racarr, thanks === mmrazik is now known as mmrazik|afk === kdub_ is now known as kdub [16:21] with swapper-swapper, i can't decide if having an empty swapper and filling it later with buffers (such as adopt_buffer(mc::Buffer)) is 2 step initialization or not :) [16:23] Is it a precondition of using it that it is filled? [16:26] in swapper-swapper's current state, i decided that it was, hence, i bundle the factory function and send it down via function interface [16:26] kdub: alan_g: right now compositor_acquire() assumes that it always has a buffer [16:26] right, so i guess it is [16:27] maybe the solution is to have the SwapperMaster have the SwapperFactory, and it can alloc the new swapper [16:27] all: Have a great rest of day. Talk to you tomorrow! [16:27] instead of having BufferBundle kick a lambda down to indicate a change [16:27] alf_: Bye [16:27] you too alf_ [16:27] Bye alf_ [16:51] * alan_g sees a fight coming: ~robertcarr/mir/display-sizes-are-unsigned vs ~vanvugt/mir/move [16:57] what [16:58] oh [16:58] I see [16:58] haha [16:58] Goodbye all - have a good one! === alan_g is now known as alan_g|life [16:59] See you! [18:01] New platform-api branch is done except for some packaging bits that Gerry is going to help me with at ~robertcarr/platform-api/mir2 [18:01] moving on to qtubuntu now which should just be small things. Hopefully have things unity8 running on platform-api-v2/mir tomorrow [18:33] racarr, very cool [18:33] racarr, if you have time, could you look over swapper-swapper? many eyes make for better thread code :) [18:40] kdub: Ok I will try. I know I said I would a few days ago then i got distracted by the stress test thread code XD [18:40] I think I can do it after lunch though, before moving on to qtubuntu [18:41] also by the end of lunch hopefully they will be done turning the concrete on the road in to [18:41] powdered concrete [18:41] and I might be able to focus long enough to do a review XD [18:42] racarr, thanks :) threading code reviews are funnier than the straightforward ones [18:43] because the reviews process ends with ' well, can't find anything wrong', instead of 'looks good to me' ;) [18:44] kdub: But what about the mathematical proof of the display server [18:49] Lunch! back soon === mmrazik|afk is now known as mmrazik [19:37] i've worked out this fun way of bouncing c++ compile errors between clang and gcc to get the quickest reading on the problem for every situation [19:44] Annnd back [19:44] kdub: ? [19:45] or do you just mean you go back and forth betwween them [19:45] because that's what I do XD [19:49] we just need a 3rd or 4th compiler toolchain, then we'd be really quick at diagnosing google mock explosions ;) [19:59] kdub: Ok going to review swapper swapper now [20:16] kdub: I think alan's last comment about bundling up was about [20:16] the signature appearing so frequently it should be a composite type (vector reference bufers, size_t) [20:17] I'm not sure, I was just thinking it's hard or me to understand size_t& original_size in end_responsibility [20:17] but I am not very far yet :) [20:18] the difference there is that during a switch, the number of buffers the dying swapper is responsible for can be different than the number of buffers the dying swapper is curerntly in possession of [20:26] Mm [20:26] ok I think I understand what is supposed to happen/the overall control flow now [20:28] kdub: I also don't understand why BufferSwapperMaster extends BufferSwapper [20:28] but that's ok for now I gues [20:31] the SwapperSwitcher has to redirect returning buffers from the swapper that was destroyed to the new swapper [20:31] really, I expect BufferSwapperMaster and BufferBundle to merge [20:31] mm, so SwapperSwitcher implement BufferSwapperMaster and BufferSwapper [20:32] but they are two interfaces? [20:32] no, i think of it as a BufferSwapperMaster is a BufferSwapper that can also change between algorithms [20:34] Mm [20:35] kdub: Ok I think the locking makes sense. The one thing I am hung up on now [20:35] is why the exception for control flow in SwapperSwitcher. [20:36] Can't it be anticipated that [20:36] swapper->client_acuire will throw forced_completion [20:37] by updating some member variable in change_swapper [20:37] no, because the client could have entered its wait long before the command to change the swapper comes in [20:39] Mm right... [20:39] kdub: Hmm, so [20:39] is it so/is it a problem [20:39] that, say 2 clients are waiting, and the swapper changes [20:40] they are no longer guaranteed to get buffers in the order [20:40] they requested them [20:40] hmm, thinking [20:41] right, because they are woken up at the same time after blocking when they handle the forced completion exception, then it's a race to call client acquire the second time [20:41] well, as it is now, the client only has one buffer at a time [20:42] der! [20:42] and it would be a race in BufferSwapperMulti as well, so I don't think its a problem [20:42] Sorry, silly questions, it's just not very well loaded in my head [20:42] mm [20:43] racarr, np, they're good questions to think about [20:44] kdub: Is SwatcherSwitcher::end_responsibility a real TODO? [20:44] what should it do... [20:45] Swapper* XD [20:45] SwatcherSwitcher might be a nice color management object though [20:45] racarr, it is, technically, it should return the bu ffers to whoever owned it... i'd expect that as I do another pass on the interface (and the BufferBundle interface) that function would go away [20:50] Mm makes sense. [20:50] tests make sense :) cool test for RWLock [20:51] kdub: I am a little suspiscious of [20:51] test_swapping_swappers [20:51] .cpp [20:51] because you can comment out the implementation of change_swapper and it still passes ;) [20:52] but I can understand how it's useful as a stress integration test... [20:52] um [20:53] I don't know it might be nice if there were a different filename like stress_test_swapping_swappers so people like me don't look for how it tests swapping swappers [20:53] but that's not a huge problem either and the test names clear it up really [20:55] kdub: Ok! LGTM [20:56] I didn't really go through for whitespace/style because I guess Alan/Alexandros did [20:56] racarr, well, if you comment out change_swapper, it is just tests that the swappers in normal conditions work ok. the change_swapper() is the essential part [20:56] but am pretty convinced on the logic [20:56] racarr, thanks! [20:56] kdub: Right, but I mean the test file name implies [20:56] that it tests, the swapper changing functionality works [20:56] whereas in fact even if it doesn't, the test can still work. [20:57] the subtle ways that test failed when I first wrote it were things like, it would hang, or the buffer's references would be lost [20:58] so its one of those 'don't hang, don't lose the buffers' sort of tests :) [20:59] thanks again though! [21:00] no worries! It was interesting [21:50] racarr, I understand you can point me at android input drivers for the desktop? [22:16] bregma: Maybe! [22:16] Can you clarify what you are looking for / expecting, because there aren't userspace drivers for specific input devices like in X11 [22:28] racarr, I'm looking for what needs to happen to get Unity8 on the desktop, I understood there was an android-based layer on top of evdev available? [22:32] bregma: Yes. [22:33] I think nothing special needs to happen (beyond everything else) we have it going on the desktop, it delivers events to Qt, etc. [22:36] til: If you want to include symbols in your shared library from a static library and don't reference them internally you need to use -Wl,--whole-archive before your library, but then you also need to use -Wl,--no-whole-archive after your library [22:36] because G++ appends its own libraries to the end of your list [22:41] Whee, qtubuntu builds again [22:41] bregma: Sorry I was pretty distracted XD um [22:41] so yeah it's a layer on top of evdev that was originally android code [22:42] though we've pulled out all the android dependencies, etc... [22:42] and replaced some bits, for example we use xkbcommon for keymapping, etc. [22:42] So it should be well suited for the desktop and we are matching it up with Qt, etc. [22:43] one thing that is perhaps, a bit of an open question (at least not entirely closed to me, maybe someone knows the answer) [22:43] is where/how we will do things that happen in X11 drivers for the desktop, that are of interest [22:43] i.e. things like two finger scroll on synaptics [22:43] etc [23:20] haha, happened across some old mir prototyping code that had a todo in the gl renderer 'todo: replace with nux' [23:26] kdub: The normal spelling is 'QML' [23:26] XD. Nux is still in RoughArchitecture.png too [23:31] haha, yeah [23:31] once i cross compiled nux for android, using the android ndk [23:31] that was a painful week :) [23:51] Mm I bet [23:52] just tested and ironed out a few errors and now ran some QML apps on top of platform-api-v2/mir [23:52] now I just need to fix key mapping again (mostly deleting the correct code now that we do xkbcommon) [23:52] andddddddddd [23:52] then something I suppose ;)