diff options
-rwxr-xr-x | tests/kms-test-crc.py | 2 | ||||
-rwxr-xr-x | tests/kmstest.py | 66 |
2 files changed, 61 insertions, 7 deletions
diff --git a/tests/kms-test-crc.py b/tests/kms-test-crc.py index 30d8bea..29147e5 100755 --- a/tests/kms-test-crc.py +++ b/tests/kms-test-crc.py @@ -56,7 +56,7 @@ class CRCTest(kmstest.KMSTest): self.fail("atomic mode set failed with %d" % ret) continue - req = pykms.AtomicReq(self.card) + req = kmstest.AtomicRequest(self.card) offset = 100 for plane in planes: diff --git a/tests/kmstest.py b/tests/kmstest.py index 12454df..706ba91 100755 --- a/tests/kmstest.py +++ b/tests/kmstest.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 +import collections.abc import errno import fcntl import os @@ -208,6 +209,41 @@ class Rect(object): self.height = height +class AtomicRequest(pykms.AtomicReq): + """pymkms.AtomicReq wrapper to track state changes""" + def __init__(self, test): + super().__init__(test.card) + self.__test = test + self.__props = {} + + def add(self, obj, *kwargs): + if obj.id not in self.__props: + self.__props[obj.id] = {} + props = self.__props[obj.id] + + if len(kwargs) == 1 and isinstance(kwargs[0], collections.abc.Mapping): + props.update(kwargs[0]) + elif len(kwargs) == 2: + props[kwargs[0]] = kwargs[1] + + super().add(obj, *kwargs) + + def commit(self, data=0, allow_modeset=False): + ret = super().commit(data, allow_modeset) + if ret == 0: + self.__test._props.update(self.__props) + return ret + + def commit_sync(self, allow_modeset=False): + ret = super().commit_sync(allow_modeset) + if ret == 0: + self.__test._props.update(self.__props) + return ret + + def __repr__(self): + return repr(self.__props) + + class KMSTest(object): def __init__(self, use_default_key_handler=False): if not getattr(self, 'main', None): @@ -217,6 +253,8 @@ class KMSTest(object): if not self.card.has_atomic: raise RuntimeError("Device doesn't support the atomic API") + self._props = {} + logname = self.__class__.__name__ self.logger = Logger(logname) @@ -233,8 +271,24 @@ class KMSTest(object): return {k: v & ((1 << 64) - 1) for k, v in props.items()} def atomic_crtc_disable(self, crtc, sync=True): - req = pykms.AtomicReq(self.card) - req.add(crtc, 'ACTIVE', False) + req = AtomicRequest(self) + req.add(crtc, {'ACTIVE': 0, 'MODE_ID': 0}) + for connector in self.card.connectors: + if connector.id in self._props: + props = self._props[connector.id] + try: + if props['CRTC_ID'] == crtc.id: + req.add(connector, 'CRTC_ID', 0) + except KeyError: + pass + for plane in self.card.planes: + if plane.id in self._props: + props = self._props[plane.id] + try: + if props['CRTC_ID'] == crtc.id: + req.add(plane, {'CRTC_ID': 0, 'FB_ID': 0}) + except KeyError: + pass if sync: return req.commit_sync(True) else: @@ -249,7 +303,7 @@ class KMSTest(object): # the commit completes. mode_blob = mode.to_blob(self.card) - req = pykms.AtomicReq(self.card) + req = AtomicRequest(self) req.add(connector, 'CRTC_ID', crtc.id) req.add(crtc, { 'ACTIVE': 1, 'MODE_ID': mode_blob.id }) if fb: @@ -271,7 +325,7 @@ class KMSTest(object): return req.commit(0, True) def atomic_plane_set(self, plane, crtc, source, destination, fb, sync=False): - req = pykms.AtomicReq(self.card) + req = AtomicRequest(self) req.add(plane, self.__format_props({ 'FB_ID': fb.id, 'CRTC_ID': crtc.id, @@ -290,7 +344,7 @@ class KMSTest(object): return req.commit(0) def atomic_plane_disable(self, plane, sync=True): - req = pykms.AtomicReq(self.card) + req = AtomicRequest(self) req.add(plane, { "FB_ID": 0, 'CRTC_ID': 0 }) if sync: @@ -299,7 +353,7 @@ class KMSTest(object): return req.commit(0) def atomic_planes_disable(self, sync=True): - req = pykms.AtomicReq(self.card) + req = AtomicRequest(self) for plane in self.card.planes: req.add(plane, { "FB_ID": 0, 'CRTC_ID': 0 }) |