Mir

Merge lp:~alan-griffiths/mir/mesa-hybrid-cursor into lp:mir

Proposed by Alan Griffiths
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 4193
Proposed branch: lp:~alan-griffiths/mir/mesa-hybrid-cursor
Merge into: lp:mir
Diff against target: 547 lines (+259/-63)
7 files modified
src/common/CMakeLists.txt (+2/-1)
src/platforms/mesa/server/kms/CMakeLists.txt (+1/-0)
src/platforms/mesa/server/kms/cursor.cpp (+117/-31)
src/platforms/mesa/server/kms/cursor.h (+21/-7)
src/platforms/mesa/server/kms/display.cpp (+3/-14)
src/platforms/mesa/server/kms/mutex.h (+104/-0)
tests/unit-tests/platforms/mesa/kms/test_cursor.cpp (+11/-10)
To merge this branch: bzr merge lp:~alan-griffiths/mir/mesa-hybrid-cursor
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Approve
Chris Halse Rogers Approve
Alberto Aguirre (community) Approve
Alan Griffiths Pending
Review via email: mp+325215@code.launchpad.net

This proposal supersedes a proposal from 2017-03-22.

Commit message

mesa-kms: Support hardware cursors in hybrid setups.

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:4086
https://mir-jenkins.ubuntu.com/job/mir-ci/3208/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4317/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4404/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/4394/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/4394/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4394/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4349/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/4349/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4349/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/4349/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/4349/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/4349/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3208/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:4087
https://mir-jenkins.ubuntu.com/job/mir-ci/3218/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4331/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4418
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/4408
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/4408
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4408
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4363
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4363/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/4363/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4363/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/4363/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/4363/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/4363/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3218/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:4087
https://mir-jenkins.ubuntu.com/job/mir-ci/3247/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4371/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4458
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/4448
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/4448
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4448
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4403
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4403/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/4403/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4403/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/4403/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/4403/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/4403/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3247/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:4088
https://mir-jenkins.ubuntu.com/job/mir-ci/3273/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4413/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4505
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/4495
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/4495
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4495
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4445
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4445/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/4445/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4445/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/4445/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/4445/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/4445/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3273/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:4088
https://mir-jenkins.ubuntu.com/job/mir-ci/3350/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4524/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4642
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/4631
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4631
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/4631
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4631
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4555
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4555/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/4555/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4555/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/4555/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/4555/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/4555/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3350/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote : Posted in a previous version of this proposal

It isn't clear why this failed CI (and too much time has passed to see any logs).

It still merges and doesn't obviously break things - so is it still worth landing?

review: Needs Information
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote : Posted in a previous version of this proposal

FAILED: Continuous integration, rev:4088
https://mir-jenkins.ubuntu.com/job/mir-ci/3443/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4689/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4824
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4814
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4814
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4814
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4726
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4726/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4726
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4726/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4726/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4726/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4726/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4726/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4726/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4726/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3443/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote : Posted in a previous version of this proposal

It's still worth merging. Once it builds, it seems!

Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:4191
https://mir-jenkins.ubuntu.com/job/mir-ci/3446/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4695
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4830
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4820
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4820
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4820
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4732/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4732/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4732/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4732/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4732/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4732/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4732/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4732
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4732/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3446/rebuild

review: Approve (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

+{
87 + const_cast<gbm_bo*&>(from.buffer) = nullptr;
88 + const_cast<gbm_device*&>(from.device) = nullptr;

Seems like undefined behavior.

Use a unique_ptr with custom deleter instead and move the unique_ptrs on move constructor.

165 + memset(dest, 0, buffer_stride * (gbm_bo_get_height(buffer) - image_height));

"gbm_bo_get_height(buffer) - image_height" could be negative and implicitly converted to size_t (so a huge number - Needs a check.

review: Needs Fixing
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> +{
> 87 + const_cast<gbm_bo*&>(from.buffer) = nullptr;
> 88 + const_cast<gbm_device*&>(from.device) = nullptr;
>
> Seems like undefined behavior.

Fixed

> 165 + memset(dest, 0, buffer_stride * (gbm_bo_get_height(buffer) -
> image_height));
>
> "gbm_bo_get_height(buffer) - image_height" could be negative and implicitly
> converted to size_t (so a huge number - Needs a check.

Unless I'm missing something (always possible) there is a check Vis:

    if (image_width > min_buffer_width || image_height > min_buffer_height)
    {
        BOOST_THROW_EXCEPTION(std::logic_error("Image is too big for GBM cursor buffer"));
    }

AIUI min_buffer_height ought to be <= gbm_bo_get_height(buffer)

Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:4192
https://mir-jenkins.ubuntu.com/job/mir-ci/3448/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4699
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4836
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4826
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4826
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4826
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4736/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4736/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4736/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4736/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4736/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4736/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4736/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4736
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4736/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3448/rebuild

review: Approve (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

Oh right... it was just a convoluted way of checking yeah.

review: Approve
Revision history for this message
Mir CI Bot (mir-ci-bot) :
review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1331/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4702
    FAILURE: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1416/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1417/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4839
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4829
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4829
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4829
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4739/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4739/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4739/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4739/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4739/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4739/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4739/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4739
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4739/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

LGTM.

FWIW, this seems to be against our style guide:
191 + {
192 + pad_and_write_image_data_locked(lg, buffer, cursor_image);
193 + } else
194 + {

review: Approve
Revision history for this message
Mir CI Bot (mir-ci-bot) :
review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Autolanding.
Unapproved changes made after approval.
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1334/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4705
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1421/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4844
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4834
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4834
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4834
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4742/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1334/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4705
    FAILURE: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1421/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1422/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4844
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4834
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4834
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4834
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4742/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4742
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4742/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:4193
https://mir-jenkins.ubuntu.com/job/mir-ci/3451/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4707
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4846
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4836
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4836
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4836
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4744/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4744/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4744/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4744/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4744/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4744/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4744/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4744
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4744/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/3451/rebuild

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/common/CMakeLists.txt'
--- src/common/CMakeLists.txt 2017-05-08 03:04:26 +0000
+++ src/common/CMakeLists.txt 2017-06-09 10:22:51 +0000
@@ -20,7 +20,8 @@
20 $<TARGET_OBJECTS:mirtime>20 $<TARGET_OBJECTS:mirtime>
21 ${CMAKE_CURRENT_SOURCE_DIR}/output_type_names.cpp21 ${CMAKE_CURRENT_SOURCE_DIR}/output_type_names.cpp
22 ${CMAKE_CURRENT_SOURCE_DIR}/log.cpp22 ${CMAKE_CURRENT_SOURCE_DIR}/log.cpp
23 ${CMAKE_CURRENT_SOURCE_DIR}/libname.cpp ${PROJECT_SOURCE_DIR}/include/common/mir/libname.h23 ${CMAKE_CURRENT_SOURCE_DIR}/libname.cpp
24 ${PROJECT_SOURCE_DIR}/include/common/mir/libname.h
24 ${PROJECT_SOURCE_DIR}/include/common/mir/posix_rw_mutex.h25 ${PROJECT_SOURCE_DIR}/include/common/mir/posix_rw_mutex.h
25 posix_rw_mutex.cpp26 posix_rw_mutex.cpp
26 edid.cpp27 edid.cpp
2728
=== modified file 'src/platforms/mesa/server/kms/CMakeLists.txt'
--- src/platforms/mesa/server/kms/CMakeLists.txt 2017-05-17 04:48:46 +0000
+++ src/platforms/mesa/server/kms/CMakeLists.txt 2017-06-09 10:22:51 +0000
@@ -43,6 +43,7 @@
43 real_kms_output_container.cpp43 real_kms_output_container.cpp
44 egl_helper.h44 egl_helper.h
45 egl_helper.cpp45 egl_helper.cpp
46 mutex.h
46)47)
4748
48configure_file(${CMAKE_CURRENT_SOURCE_DIR}/symbols.map.in49configure_file(${CMAKE_CURRENT_SOURCE_DIR}/symbols.map.in
4950
=== modified file 'src/platforms/mesa/server/kms/cursor.cpp'
--- src/platforms/mesa/server/kms/cursor.cpp 2017-05-08 03:04:26 +0000
+++ src/platforms/mesa/server/kms/cursor.cpp 2017-06-09 10:22:51 +0000
@@ -88,34 +88,74 @@
88 drmGetCap(fd, DRM_CAP_CURSOR_WIDTH, &width);88 drmGetCap(fd, DRM_CAP_CURSOR_WIDTH, &width);
89 return int(width);89 return int(width);
90}90}
91}91
9292gbm_device* gbm_create_device_checked(int fd)
93mgm::Cursor::GBMBOWrapper::GBMBOWrapper(gbm_device* gbm) :93{
94 buffer(gbm_bo_create(94 auto device = gbm_create_device(fd);
95 gbm,95 if (!device)
96 get_drm_cursor_width(gbm_device_get_fd(gbm)),96 {
97 get_drm_cursor_height(gbm_device_get_fd(gbm)),97 BOOST_THROW_EXCEPTION(std::runtime_error("Failed to create gbm device"));
98 GBM_FORMAT_ARGB8888,98 }
99 GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))99 return device;
100}
101}
102
103mgm::Cursor::GBMBOWrapper::GBMBOWrapper(int fd) :
104 device{gbm_create_device_checked(fd)},
105 buffer{
106 gbm_bo_create(
107 device,
108 get_drm_cursor_width(fd),
109 get_drm_cursor_height(fd),
110 GBM_FORMAT_ARGB8888,
111 GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE)}
100{112{
101 if (!buffer) BOOST_THROW_EXCEPTION(std::runtime_error("failed to create gbm buffer"));113 if (!buffer) BOOST_THROW_EXCEPTION(std::runtime_error("failed to create gbm buffer"));
102}114}
103115
104inline mgm::Cursor::GBMBOWrapper::operator gbm_bo*() { return buffer; }116inline mgm::Cursor::GBMBOWrapper::operator gbm_bo*()
105inline mgm::Cursor::GBMBOWrapper::~GBMBOWrapper() { gbm_bo_destroy(buffer); }117{
118 return buffer;
119}
120
121inline mgm::Cursor::GBMBOWrapper::~GBMBOWrapper()
122{
123 if (device)
124 gbm_device_destroy(device);
125 if (buffer)
126 gbm_bo_destroy(buffer);
127}
128
129mgm::Cursor::GBMBOWrapper::GBMBOWrapper(GBMBOWrapper&& from)
130 : device{from.device},
131 buffer{from.buffer}
132{
133 from.buffer = nullptr;
134 from.device = nullptr;
135}
106136
107mgm::Cursor::Cursor(137mgm::Cursor::Cursor(
108 gbm_device* gbm,
109 KMSOutputContainer& output_container,138 KMSOutputContainer& output_container,
110 std::shared_ptr<CurrentConfiguration> const& current_configuration) :139 std::shared_ptr<CurrentConfiguration> const& current_configuration) :
111 output_container(output_container),140 output_container(output_container),
112 current_position(),141 current_position(),
113 last_set_failed(false),142 last_set_failed(false),
114 buffer(gbm),143 min_buffer_width{std::numeric_limits<uint32_t>::max()},
115 buffer_width(gbm_bo_get_width(buffer)),144 min_buffer_height{std::numeric_limits<uint32_t>::max()},
116 buffer_height(gbm_bo_get_height(buffer)),
117 current_configuration(current_configuration)145 current_configuration(current_configuration)
118{146{
147 // Generate the buffers for the initial configuration.
148 current_configuration->with_current_configuration_do(
149 [this](KMSDisplayConfiguration const& kms_conf)
150 {
151 kms_conf.for_each_output(
152 [this, &kms_conf](auto const& output)
153 {
154 // I'm not sure why g++ needs the explicit "this->" but it does - alan_g
155 this->buffer_for_output(*kms_conf.get_output_for(output.id));
156 });
157 });
158
119 hide();159 hide();
120 if (last_set_failed)160 if (last_set_failed)
121 throw std::runtime_error("Initial KMS cursor set failed");161 throw std::runtime_error("Initial KMS cursor set failed");
@@ -126,7 +166,11 @@
126 hide();166 hide();
127}167}
128168
129void mgm::Cursor::write_buffer_data_locked(std::lock_guard<std::mutex> const&, void const* data, size_t count)169void mgm::Cursor::write_buffer_data_locked(
170 std::lock_guard<std::mutex> const&,
171 gbm_bo* buffer,
172 void const* data,
173 size_t count)
130{174{
131 if (auto result = gbm_bo_write(buffer, data, count))175 if (auto result = gbm_bo_write(buffer, data, count))
132 {176 {
@@ -136,20 +180,23 @@
136 }180 }
137}181}
138182
139void mgm::Cursor::pad_and_write_image_data_locked(std::lock_guard<std::mutex> const& lg, CursorImage const& image)183void mgm::Cursor::pad_and_write_image_data_locked(
184 std::lock_guard<std::mutex> const& lg,
185 gbm_bo* buffer,
186 CursorImage const& image)
140{187{
141 auto image_argb = static_cast<uint8_t const*>(image.as_argb_8888());188 auto image_argb = static_cast<uint8_t const*>(image.as_argb_8888());
142 auto image_width = image.size().width.as_uint32_t();189 auto image_width = image.size().width.as_uint32_t();
143 auto image_height = image.size().height.as_uint32_t();190 auto image_height = image.size().height.as_uint32_t();
144 auto image_stride = image_width * 4;191 auto image_stride = image_width * 4;
145192
146 if (image_width > buffer_width || image_height > buffer_height)193 if (image_width > min_buffer_width || image_height > min_buffer_height)
147 {194 {
148 BOOST_THROW_EXCEPTION(std::logic_error("Image is too big for GBM cursor buffer"));195 BOOST_THROW_EXCEPTION(std::logic_error("Image is too big for GBM cursor buffer"));
149 }196 }
150 197
151 size_t buffer_stride = gbm_bo_get_stride(buffer); // in bytes198 size_t buffer_stride = gbm_bo_get_stride(buffer); // in bytes
152 size_t padded_size = buffer_stride * buffer_height;199 size_t padded_size = buffer_stride * gbm_bo_get_height(buffer);
153 auto padded = std::unique_ptr<uint8_t[]>(new uint8_t[padded_size]);200 auto padded = std::unique_ptr<uint8_t[]>(new uint8_t[padded_size]);
154 size_t rhs_padding = buffer_stride - image_stride;201 size_t rhs_padding = buffer_stride - image_stride;
155202
@@ -164,9 +211,9 @@
164 src += image_stride;211 src += image_stride;
165 }212 }
166213
167 memset(dest, 0, buffer_stride * (buffer_height - image_height));214 memset(dest, 0, buffer_stride * (gbm_bo_get_height(buffer) - image_height));
168215
169 write_buffer_data_locked(lg, &padded[0], padded_size);216 write_buffer_data_locked(lg, buffer, &padded[0], padded_size);
170}217}
171218
172void mgm::Cursor::show()219void mgm::Cursor::show()
@@ -186,14 +233,21 @@
186233
187 auto const& size = cursor_image.size();234 auto const& size = cursor_image.size();
188235
189 if (size != geometry::Size{buffer_width, buffer_height})236 {
190 {237 auto locked_buffers = buffers.lock();
191 pad_and_write_image_data_locked(lg, cursor_image);238 for (auto& pair : *locked_buffers)
192 }239 {
193 else240 auto& buffer = pair.second;
194 {241 if (size != geometry::Size{gbm_bo_get_width(buffer), gbm_bo_get_height(buffer)})
195 auto const count = size.width.as_uint32_t() * size.height.as_uint32_t() * sizeof(uint32_t);242 {
196 write_buffer_data_locked(lg, cursor_image.as_argb_8888(), count);243 pad_and_write_image_data_locked(lg, buffer, cursor_image);
244 }
245 else
246 {
247 auto const count = size.width.as_uint32_t() * size.height.as_uint32_t() * sizeof(uint32_t);
248 write_buffer_data_locked(lg, buffer, cursor_image.as_argb_8888(), count);
249 }
250 }
197 }251 }
198 hotspot = cursor_image.hotspot();252 hotspot = cursor_image.hotspot();
199 253
@@ -288,7 +342,7 @@
288 output.move_cursor(geom::Point{} + dp - hotspot);342 output.move_cursor(geom::Point{} + dp - hotspot);
289 if (force_state || !output.has_cursor()) // TODO - or if orientation had changed - then set buffer..343 if (force_state || !output.has_cursor()) // TODO - or if orientation had changed - then set buffer..
290 {344 {
291 if (!output.set_cursor(buffer) || !output.has_cursor())345 if (!output.set_cursor(buffer_for_output(output)) || !output.has_cursor())
292 set_on_all_outputs = false;346 set_on_all_outputs = false;
293 }347 }
294 }348 }
@@ -303,3 +357,35 @@
303357
304 last_set_failed = !set_on_all_outputs;358 last_set_failed = !set_on_all_outputs;
305}359}
360
361gbm_bo* mgm::Cursor::buffer_for_output(KMSOutput const& output)
362{
363 auto locked_buffers = buffers.lock();
364
365 auto buffer_it = std::find_if(
366 locked_buffers->begin(),
367 locked_buffers->end(),
368 [&output](auto const& candidate)
369 {
370 return candidate.first == output.drm_fd();
371 });
372
373 if (buffer_it != locked_buffers->end())
374 {
375 return buffer_it->second;
376 }
377
378 locked_buffers->push_back(std::make_pair(output.drm_fd(), GBMBOWrapper(output.drm_fd())));
379
380 gbm_bo* bo = locked_buffers->back().second;
381 if (gbm_bo_get_width(bo) < min_buffer_width)
382 {
383 min_buffer_width = gbm_bo_get_width(bo);
384 }
385 if (gbm_bo_get_height(bo) < min_buffer_height)
386 {
387 min_buffer_height = gbm_bo_get_height(bo);
388 }
389
390 return bo;
391}
306392
=== modified file 'src/platforms/mesa/server/kms/cursor.h'
--- src/platforms/mesa/server/kms/cursor.h 2017-05-25 02:47:48 +0000
+++ src/platforms/mesa/server/kms/cursor.h 2017-06-09 10:22:51 +0000
@@ -25,12 +25,14 @@
25#include "mir/geometry/displacement.h"25#include "mir/geometry/displacement.h"
2626
27#include "mir_toolkit/common.h"27#include "mir_toolkit/common.h"
28#include "mutex.h"
2829
29#include <gbm.h>30#include <gbm.h>
3031
31#include <functional>32#include <functional>
32#include <memory>33#include <memory>
33#include <mutex>34#include <mutex>
35#include <vector>
3436
35namespace mir37namespace mir
36{38{
@@ -67,7 +69,6 @@
67{69{
68public:70public:
69 Cursor(71 Cursor(
70 gbm_device* device,
71 KMSOutputContainer& output_container,72 KMSOutputContainer& output_container,
72 std::shared_ptr<CurrentConfiguration> const& current_configuration);73 std::shared_ptr<CurrentConfiguration> const& current_configuration);
7374
@@ -87,9 +88,18 @@
87 void for_each_used_output(std::function<void(KMSOutput&, geometry::Rectangle const&, MirOrientation orientation)> const& f);88 void for_each_used_output(std::function<void(KMSOutput&, geometry::Rectangle const&, MirOrientation orientation)> const& f);
88 void place_cursor_at(geometry::Point position, ForceCursorState force_state);89 void place_cursor_at(geometry::Point position, ForceCursorState force_state);
89 void place_cursor_at_locked(std::lock_guard<std::mutex> const&, geometry::Point position, ForceCursorState force_state);90 void place_cursor_at_locked(std::lock_guard<std::mutex> const&, geometry::Point position, ForceCursorState force_state);
90 void write_buffer_data_locked(std::lock_guard<std::mutex> const&, void const* data, size_t count);91 void write_buffer_data_locked(
91 void pad_and_write_image_data_locked(std::lock_guard<std::mutex> const&, CursorImage const& image);92 std::lock_guard<std::mutex> const&,
93 gbm_bo* buffer,
94 void const* data,
95 size_t count);
96 void pad_and_write_image_data_locked(
97 std::lock_guard<std::mutex> const&,
98 gbm_bo* buffer,
99 CursorImage const& image);
92 void clear(std::lock_guard<std::mutex> const&);100 void clear(std::lock_guard<std::mutex> const&);
101
102 gbm_bo* buffer_for_output(KMSOutput const& output);
93 103
94 std::mutex guard;104 std::mutex guard;
95105
@@ -102,17 +112,21 @@
102112
103 struct GBMBOWrapper113 struct GBMBOWrapper
104 {114 {
105 GBMBOWrapper(gbm_device* gbm);115 GBMBOWrapper(int fd);
106 operator gbm_bo*();116 operator gbm_bo*();
107 ~GBMBOWrapper();117 ~GBMBOWrapper();
118
119 GBMBOWrapper(GBMBOWrapper&& from);
108 private:120 private:
121 gbm_device* device;
109 gbm_bo* buffer;122 gbm_bo* buffer;
110 GBMBOWrapper(GBMBOWrapper const&) = delete;123 GBMBOWrapper(GBMBOWrapper const&) = delete;
111 GBMBOWrapper& operator=(GBMBOWrapper const&) = delete;124 GBMBOWrapper& operator=(GBMBOWrapper const&) = delete;
112 } buffer;125 };
126 Mutex<std::vector<std::pair<int, GBMBOWrapper>>> buffers;
113127
114 uint32_t buffer_width;128 uint32_t min_buffer_width;
115 uint32_t buffer_height;129 uint32_t min_buffer_height;
116130
117 std::shared_ptr<CurrentConfiguration> const current_configuration;131 std::shared_ptr<CurrentConfiguration> const current_configuration;
118};132};
119133
=== modified file 'src/platforms/mesa/server/kms/display.cpp'
--- src/platforms/mesa/server/kms/display.cpp 2017-05-08 03:04:26 +0000
+++ src/platforms/mesa/server/kms/display.cpp 2017-06-09 10:22:51 +0000
@@ -339,17 +339,6 @@
339339
340auto mgm::Display::create_hardware_cursor() -> std::shared_ptr<graphics::Cursor>340auto mgm::Display::create_hardware_cursor() -> std::shared_ptr<graphics::Cursor>
341{341{
342 /*
343 * TODO: Using the hardware cursor in a hybrid-output situation requires making
344 * mgm::Cursor hybrid-aware so it can create a cursor bo on each GPU.
345 *
346 * For a first cut, just disable the hardware cursor on hybrid systems.
347 */
348 if (drm.size() > 1)
349 {
350 return nullptr;
351 }
352
353 // There is only one hardware cursor. We do not keep a strong reference to it in the display though,342 // There is only one hardware cursor. We do not keep a strong reference to it in the display though,
354 // if no other component of Mir is interested (i.e. the input stack does not keep a reference to send343 // if no other component of Mir is interested (i.e. the input stack does not keep a reference to send
355 // position updates) we must be configured not to use a cursor and thusly let it deallocate.344 // position updates) we must be configured not to use a cursor and thusly let it deallocate.
@@ -377,9 +366,9 @@
377366
378 try367 try
379 {368 {
380 locked_cursor = std::make_shared<Cursor>(gbm->device,369 locked_cursor = std::make_shared<Cursor>(
381 *output_container,370 *output_container,
382 std::make_shared<KMSCurrentConfiguration>(*this));371 std::make_shared<KMSCurrentConfiguration>(*this));
383 }372 }
384 catch (std::runtime_error const&)373 catch (std::runtime_error const&)
385 {374 {
386375
=== added file 'src/platforms/mesa/server/kms/mutex.h'
--- src/platforms/mesa/server/kms/mutex.h 1970-01-01 00:00:00 +0000
+++ src/platforms/mesa/server/kms/mutex.h 2017-06-09 10:22:51 +0000
@@ -0,0 +1,104 @@
1/*
2 * Copyright © 2017 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authored by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
17 */
18
19#ifndef MIR_MUTEX_H_
20#define MIR_MUTEX_H_
21
22#include <mutex>
23
24namespace mir
25{
26/**
27 * Smart-pointer-esque accessor for Mutex<> protected data.
28 *
29 * Ensures exclusive access to the referenced data.
30 *
31 * \tparam Guarded Type of data guarded by the mutex.
32 */
33template<typename Guarded>
34class MutexGuard
35{
36public:
37 MutexGuard(std::unique_lock<std::mutex>&& lock, Guarded& value)
38 : value{value},
39 lock{std::move(lock)}
40 {
41 }
42 MutexGuard(MutexGuard&& from) = default;
43 ~MutexGuard() noexcept(false)
44 {
45 if (lock.owns_lock())
46 {
47 lock.unlock();
48 }
49 }
50
51 Guarded& operator*()
52 {
53 return value;
54 }
55 Guarded* operator->()
56 {
57 return &value;
58 }
59private:
60 Guarded& value;
61 std::unique_lock<std::mutex> lock;
62};
63
64/**
65 * A data-locking mutex
66 *
67 * This is a mutex which owns the data it guards, and can give out a
68 * smart-pointer-esque lock to lock and access it.
69 *
70 * \tparam Guarded The type of data guarded by the mutex
71 */
72template<typename Guarded>
73class Mutex
74{
75public:
76 Mutex() = default;
77 Mutex(Guarded&& initial_value)
78 : value{std::move(initial_value)}
79 {
80 }
81
82 Mutex(Mutex const&) = delete;
83 Mutex& operator=(Mutex const&) = delete;
84
85 /**
86 * Lock the mutex and return an accessor for the protected data.
87 *
88 * \return A smart-pointer-esque accessor for the contained data.
89 * While code has access to the MutexGuard it is guaranteed to have exclusive
90 * access to the contained data.
91 */
92 MutexGuard<Guarded> lock()
93 {
94 return MutexGuard<Guarded>{std::unique_lock<std::mutex>{mutex}, value};
95 }
96
97private:
98 std::mutex mutex;
99 Guarded value;
100};
101
102}
103
104#endif //MIR_MUTEX_H_
0105
=== modified file 'tests/unit-tests/platforms/mesa/kms/test_cursor.cpp'
--- tests/unit-tests/platforms/mesa/kms/test_cursor.cpp 2017-05-08 03:04:26 +0000
+++ tests/unit-tests/platforms/mesa/kms/test_cursor.cpp 2017-06-09 10:22:51 +0000
@@ -300,7 +300,7 @@
300300
301 size_t const cursor_side{64};301 size_t const cursor_side{64};
302 MesaCursorTest()302 MesaCursorTest()
303 : cursor{mock_gbm.fake_gbm.device, output_container,303 : cursor{output_container,
304 mt::fake_shared(current_configuration)}304 mt::fake_shared(current_configuration)}
305 {305 {
306 using namespace ::testing;306 using namespace ::testing;
@@ -351,7 +351,7 @@
351 GBM_FORMAT_ARGB8888,351 GBM_FORMAT_ARGB8888,
352 GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE));352 GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE));
353353
354 mgm::Cursor cursor_tmp{mock_gbm.fake_gbm.device, output_container,354 mgm::Cursor cursor_tmp{output_container,
355 std::make_shared<StubCurrentConfiguration>(output_container)};355 std::make_shared<StubCurrentConfiguration>(output_container)};
356}356}
357357
@@ -359,10 +359,11 @@
359{359{
360 using namespace ::testing;360 using namespace ::testing;
361361
362 EXPECT_CALL(mock_gbm, gbm_bo_get_width(_));362 // Our standard mock DRM has 2 GPU devices, and we should construct a cursor on both.
363 EXPECT_CALL(mock_gbm, gbm_bo_get_height(_));363 EXPECT_CALL(mock_gbm, gbm_bo_get_width(_)).Times(2);
364 EXPECT_CALL(mock_gbm, gbm_bo_get_height(_)).Times(2);
364365
365 mgm::Cursor cursor_tmp{mock_gbm.fake_gbm.device, output_container,366 mgm::Cursor cursor_tmp{output_container,
366 std::make_shared<StubCurrentConfiguration>(output_container)};367 std::make_shared<StubCurrentConfiguration>(output_container)};
367}368}
368369
@@ -377,7 +378,7 @@
377378
378 EXPECT_CALL(mock_gbm, gbm_bo_create(_, drm_buffer_size, drm_buffer_size, _, _));379 EXPECT_CALL(mock_gbm, gbm_bo_create(_, drm_buffer_size, drm_buffer_size, _, _));
379380
380 mgm::Cursor cursor_tmp{mock_gbm.fake_gbm.device, output_container,381 mgm::Cursor cursor_tmp{output_container,
381 std::make_shared<StubCurrentConfiguration>(output_container)};382 std::make_shared<StubCurrentConfiguration>(output_container)};
382}383}
383384
@@ -394,7 +395,7 @@
394395
395 EXPECT_CALL(mock_gbm, gbm_bo_create(_, 64, 64, _, _));396 EXPECT_CALL(mock_gbm, gbm_bo_create(_, 64, 64, _, _));
396397
397 mgm::Cursor cursor_tmp{mock_gbm.fake_gbm.device, output_container,398 mgm::Cursor cursor_tmp{output_container,
398 std::make_shared<StubCurrentConfiguration>(output_container)};399 std::make_shared<StubCurrentConfiguration>(output_container)};
399}400}
400401
@@ -458,7 +459,7 @@
458459
459 EXPECT_CALL(mock_gbm, gbm_bo_write(mock_gbm.fake_gbm.bo, ContainsASingleWhitePixel(width*height), buffer_size_bytes));460 EXPECT_CALL(mock_gbm, gbm_bo_write(mock_gbm.fake_gbm.bo, ContainsASingleWhitePixel(width*height), buffer_size_bytes));
460461
461 mgm::Cursor cursor_tmp{mock_gbm.fake_gbm.device, output_container,462 mgm::Cursor cursor_tmp{output_container,
462 std::make_shared<StubCurrentConfiguration>(output_container)};463 std::make_shared<StubCurrentConfiguration>(output_container)};
463 cursor_tmp.show(SinglePixelCursorImage());464 cursor_tmp.show(SinglePixelCursorImage());
464}465}
@@ -495,7 +496,7 @@
495 EXPECT_CALL(*output_container.outputs[1], has_cursor()).Times(0);496 EXPECT_CALL(*output_container.outputs[1], has_cursor()).Times(0);
496 EXPECT_CALL(*output_container.outputs[2], has_cursor()).Times(0);497 EXPECT_CALL(*output_container.outputs[2], has_cursor()).Times(0);
497498
498 mgm::Cursor cursor_tmp{mock_gbm.fake_gbm.device, output_container,499 mgm::Cursor cursor_tmp{output_container,
499 std::make_shared<StubCurrentConfiguration>(output_container)};500 std::make_shared<StubCurrentConfiguration>(output_container)};
500501
501 output_container.verify_and_clear_expectations();502 output_container.verify_and_clear_expectations();
@@ -513,7 +514,7 @@
513 .WillByDefault(Return(false));514 .WillByDefault(Return(false));
514515
515 EXPECT_THROW(516 EXPECT_THROW(
516 mgm::Cursor cursor_tmp(mock_gbm.fake_gbm.device, output_container,517 mgm::Cursor cursor_tmp(output_container,
517 std::make_shared<StubCurrentConfiguration>(output_container));518 std::make_shared<StubCurrentConfiguration>(output_container));
518 , std::runtime_error);519 , std::runtime_error);
519}520}

Subscribers

People subscribed via source and target branches