All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Test pixel blend mode
@ 2022-07-04  2:56 Takanari Hayama
  2022-07-04  2:56 ` [PATCH 1/3] tests: Support enum property type Takanari Hayama
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Takanari Hayama @ 2022-07-04  2:56 UTC (permalink / raw)
  To: linux-renesas-soc; +Cc: laurent.pinchart, kieran.bingham+renesas

Hello,

This patch series extends the kms-test scripts to test pixel blend mode.

The patches are based on series of patches posted by Laurent ([1]).

[1] https://lore.kernel.org/linux-renesas-soc/20220609234031.14803-1-laurent.pinchart@ideasonboard.com/T/#t

Takanari Hayama (3):
  tests: Support enum property type
  kmstest: Support specifying pixel blend mode for planes
  tests: Add pixel blend mode test

 tests/kms-test-plane-blendmode.py | 100 ++++++++++++++++++++++++++++++
 tests/kmstest.py                  |  16 ++++-
 2 files changed, 114 insertions(+), 2 deletions(-)
 create mode 100755 tests/kms-test-plane-blendmode.py

-- 
2.25.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/3] tests: Support enum property type
  2022-07-04  2:56 [PATCH 0/3] Test pixel blend mode Takanari Hayama
@ 2022-07-04  2:56 ` Takanari Hayama
  2022-07-04  8:43   ` Sergei Shtylyov
  2022-07-31 16:00   ` Laurent Pinchart
  2022-07-04  2:56 ` [PATCH 2/3] kmstest: Support specifying pixel blend mode for planes Takanari Hayama
  2022-07-04  2:56 ` [PATCH 3/3] tests: Add pixel blend mode test Takanari Hayama
  2 siblings, 2 replies; 13+ messages in thread
From: Takanari Hayama @ 2022-07-04  2:56 UTC (permalink / raw)
  To: linux-renesas-soc; +Cc: laurent.pinchart, kieran.bingham+renesas

Add a support for enum property type to AtomicRequest.

Signed-off-by: Takanari Hayama <taki@igel.co.jp>
---
 tests/kmstest.py | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/tests/kmstest.py b/tests/kmstest.py
index 11cc328b5b32..224c160e32fa 100755
--- a/tests/kmstest.py
+++ b/tests/kmstest.py
@@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
 
                     min, max = prop.values
                     v = min + int((max - min) * int(v[:-1]) / 100)
-                else:
+                elif v.isnumeric():
                     v = int(v)
+                else:
+                    prop = obj.get_prop(k)
+                    if prop.type != pykms.PropertyType.Enum:
+                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
+                    for value, mode in prop.enums.items():
+                        if mode == v:
+                            v = value
+                            break
+                    else:
+                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
 
             if not isinstance(v, int):
                 raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/3] kmstest: Support specifying pixel blend mode for planes
  2022-07-04  2:56 [PATCH 0/3] Test pixel blend mode Takanari Hayama
  2022-07-04  2:56 ` [PATCH 1/3] tests: Support enum property type Takanari Hayama
@ 2022-07-04  2:56 ` Takanari Hayama
  2022-07-31 16:02   ` Laurent Pinchart
  2022-07-04  2:56 ` [PATCH 3/3] tests: Add pixel blend mode test Takanari Hayama
  2 siblings, 1 reply; 13+ messages in thread
From: Takanari Hayama @ 2022-07-04  2:56 UTC (permalink / raw)
  To: linux-renesas-soc; +Cc: laurent.pinchart, kieran.bingham+renesas

Add an optional pixel blend mode argument to the atomic_plane_set()
function to  specify the pixel blend mode for the plane.

Signed-off-by: Takanari Hayama <taki@igel.co.jp>
---
 tests/kmstest.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tests/kmstest.py b/tests/kmstest.py
index 224c160e32fa..a39ceab3891b 100755
--- a/tests/kmstest.py
+++ b/tests/kmstest.py
@@ -395,7 +395,7 @@ class KMSTest(object):
         else:
             return req.commit(0, True)
 
-    def atomic_plane_set(self, plane, crtc, source, destination, fb, alpha=None, zpos=None, sync=False):
+    def atomic_plane_set(self, plane, crtc, source, destination, fb, alpha=None, zpos=None, blendmode=None, sync=False):
         req = AtomicRequest(self)
         req.add(plane, {
                     'FB_ID': fb.id,
@@ -413,6 +413,8 @@ class KMSTest(object):
             req.add(plane, 'alpha', alpha)
         if zpos is not None:
             req.add(plane, 'zpos', zpos)
+        if blendmode is not None:
+            req.add(plane, 'pixel blend mode', blendmode)
         if sync:
             return req.commit_sync()
         else:
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/3] tests: Add pixel blend mode test
  2022-07-04  2:56 [PATCH 0/3] Test pixel blend mode Takanari Hayama
  2022-07-04  2:56 ` [PATCH 1/3] tests: Support enum property type Takanari Hayama
  2022-07-04  2:56 ` [PATCH 2/3] kmstest: Support specifying pixel blend mode for planes Takanari Hayama
@ 2022-07-04  2:56 ` Takanari Hayama
  2022-07-31 18:50   ` Laurent Pinchart
  2 siblings, 1 reply; 13+ messages in thread
From: Takanari Hayama @ 2022-07-04  2:56 UTC (permalink / raw)
  To: linux-renesas-soc; +Cc: laurent.pinchart, kieran.bingham+renesas

Add a test that blends a plane with different pixel blend modes.

Signed-off-by: Takanari Hayama <taki@igel.co.jp>
---
 tests/kms-test-plane-blendmode.py | 100 ++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)
 create mode 100755 tests/kms-test-plane-blendmode.py

diff --git a/tests/kms-test-plane-blendmode.py b/tests/kms-test-plane-blendmode.py
new file mode 100755
index 000000000000..a9c009b74a8c
--- /dev/null
+++ b/tests/kms-test-plane-blendmode.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# SPDX-FileCopyrightText: 2022 Renesas Electronics Corporation
+
+import kmstest
+import pykms
+
+class PlaneBlendModeTest(kmstest.KMSTest):
+    """Test composition in different blend modes."""
+
+    def handle_page_flip(self, frame, time):
+        self.logger.log('Page flip complete')
+
+    def find_pipeline(self):
+        # Find a CRTC that has multiple planes with a connected connector
+        for connector in self.output_connectors():
+            # Skip disconnected connectors
+            if not connector.connected():
+                continue
+
+            # Add the connector to the map
+            for crtc in connector.get_possible_crtcs():
+                planes = []
+                for plane in self.card.planes:
+                    if plane.supports_crtc(crtc) and plane != crtc.primary_plane:
+                        planes.append(plane)
+
+                if len(planes):
+                    return crtc, connector, planes
+
+        return None, None, None
+
+    def main(self):
+        self.start('composition with blend modes')
+
+        crtc, connector, planes = self.find_pipeline()
+        if crtc is None:
+            self.skip('no suitable pipeline')
+            return
+
+        # Get the default mode
+        try:
+            mode = connector.get_default_mode()
+        except KeyError:
+            self.skip('no mode available')
+            return
+
+        self.logger.log(f'Testing connector {connector.fullname}, CRTC {crtc.id}, '
+                        f'mode {mode.name} with {len(planes)} planes '
+                        f'(P: {crtc.primary_plane.id}, O: {[plane.id for plane in planes]})')
+
+        # Create a primary plane
+        primary = pykms.DumbFramebuffer(self.card, mode.hdisplay, mode.vdisplay, 'XR24')
+        pykms.draw_test_pattern(primary)
+        #pykms.draw_rect(primary, 0, 0, mode.hdisplay, mode.vdisplay, pykms.RGB(0, 0, 255))
+
+        # Set the mode with a primary plane
+        ret = self.atomic_crtc_mode_set(crtc, connector, mode, primary)
+        if ret < 0:
+            self.fail(f'atomic mode set failed with {ret}')
+            return
+
+	# Create a overlay plane (half of the screen size)
+        fb = pykms.DumbFramebuffer(self.card, mode.hdisplay // 2, mode.vdisplay, 'AR24')
+        self.logger.log(f'Create fb: {fb} ({fb.width}x{fb.height})')
+        width = mode.hdisplay // 4
+        height = mode.vdisplay // 5
+        for n in range(0, 5):
+            v = 255 - 63 * n
+            pykms.draw_rect(fb, 0, height * n, width, height, pykms.RGB(v, 255, 255, 255))
+            pykms.draw_rect(fb, width, height * n, width, height, pykms.RGB(v, v, v, v))
+
+        self.run(3)
+
+        # Add all other planes one by one
+        source = kmstest.Rect(0, 0, fb.width, fb.height)
+        destination = kmstest.Rect(fb.width, 0, fb.width, fb.height)
+        alpha = '50%'
+        for blendmode in ('Pre-multiplied', 'Coverage', 'None'):
+            pykms.draw_text(fb, 10, 10, f'alpha={alpha}, mode={blendmode}          ', pykms.white)
+            ret = self.atomic_plane_set(planes[1], crtc, source, destination, fb, alpha=alpha, blendmode=blendmode)
+            if ret < 0:
+                self.fail(f'atomic plane set failed with {ret}')
+                break
+
+            self.logger.log(f'Adding plane {planes[1].id} with blendmode {blendmode}')
+            self.run(1)
+
+            if self.flips == 0:
+                self.fail('No page flip registered')
+                break
+
+            self.run(3)
+
+        else:
+            self.success()
+
+        self.atomic_crtc_disable(crtc)
+
+PlaneBlendModeTest().execute()
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] tests: Support enum property type
  2022-07-04  2:56 ` [PATCH 1/3] tests: Support enum property type Takanari Hayama
@ 2022-07-04  8:43   ` Sergei Shtylyov
  2022-07-04  8:53     ` Takanari Hayama
  2022-07-31 16:00   ` Laurent Pinchart
  1 sibling, 1 reply; 13+ messages in thread
From: Sergei Shtylyov @ 2022-07-04  8:43 UTC (permalink / raw)
  To: Takanari Hayama, linux-renesas-soc
  Cc: laurent.pinchart, kieran.bingham+renesas

Hello!

On 7/4/22 5:56 AM, Takanari Hayama wrote:

> Add a support for enum property type to AtomicRequest.
> 
> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
> ---
>  tests/kmstest.py | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/kmstest.py b/tests/kmstest.py
> index 11cc328b5b32..224c160e32fa 100755
> --- a/tests/kmstest.py
> +++ b/tests/kmstest.py
> @@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
>  
>                      min, max = prop.values
>                      v = min + int((max - min) * int(v[:-1]) / 100)
> -                else:
> +                elif v.isnumeric():
>                      v = int(v)
> +                else:
> +                    prop = obj.get_prop(k)
> +                    if prop.type != pykms.PropertyType.Enum:
> +                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
> +                    for value, mode in prop.enums.items():
> +                        if mode == v:
> +                            v = value
> +                            break
> +                    else:

   Hm, doesn't seem to be correctly aligned?

> +                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
>  
>              if not isinstance(v, int):
>                  raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')

MBR, Sergey

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] tests: Support enum property type
  2022-07-04  8:43   ` Sergei Shtylyov
@ 2022-07-04  8:53     ` Takanari Hayama
  2022-07-04  9:00       ` Sergei Shtylyov
  0 siblings, 1 reply; 13+ messages in thread
From: Takanari Hayama @ 2022-07-04  8:53 UTC (permalink / raw)
  To: Sergei Shtylyov
  Cc: linux-renesas-soc, laurent.pinchart, kieran.bingham+renesas

Hi Sergei,

> 2022/07/04 17:43、Sergei Shtylyov <sergei.shtylyov@gmail.com>のメール:
> 
> Hello!
> 
> On 7/4/22 5:56 AM, Takanari Hayama wrote:
> 
>> Add a support for enum property type to AtomicRequest.
>> 
>> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
>> ---
>> tests/kmstest.py | 12 +++++++++++-
>> 1 file changed, 11 insertions(+), 1 deletion(-)
>> 
>> diff --git a/tests/kmstest.py b/tests/kmstest.py
>> index 11cc328b5b32..224c160e32fa 100755
>> --- a/tests/kmstest.py
>> +++ b/tests/kmstest.py
>> @@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
>> 
>>                     min, max = prop.values
>>                     v = min + int((max - min) * int(v[:-1]) / 100)
>> -                else:
>> +                elif v.isnumeric():
>>                     v = int(v)
>> +                else:
>> +                    prop = obj.get_prop(k)
>> +                    if prop.type != pykms.PropertyType.Enum:
>> +                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
>> +                    for value, mode in prop.enums.items():
>> +                        if mode == v:
>> +                            v = value
>> +                            break
>> +                    else:
> 
>   Hm, doesn't seem to be correctly aligned?

That ‘else’ is for ‘for’-loop. Am I missing something here?

>> +                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
>> 
>>             if not isinstance(v, int):
>>                 raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')
> 
> MBR, Sergey

Many Thanks,
Takanari Hayama, Ph.D. <taki@igel.co.jp>
IGEL Co., Ltd.
https://www.igel.co.jp/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] tests: Support enum property type
  2022-07-04  8:53     ` Takanari Hayama
@ 2022-07-04  9:00       ` Sergei Shtylyov
  2022-07-04  9:13         ` Takanari Hayama
  0 siblings, 1 reply; 13+ messages in thread
From: Sergei Shtylyov @ 2022-07-04  9:00 UTC (permalink / raw)
  To: Takanari Hayama
  Cc: linux-renesas-soc, laurent.pinchart, kieran.bingham+renesas

On 7/4/22 11:53 AM, Takanari Hayama wrote:
[...]
>>> Add a support for enum property type to AtomicRequest.
>>>
>>> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
>>> ---
>>> tests/kmstest.py | 12 +++++++++++-
>>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/tests/kmstest.py b/tests/kmstest.py
>>> index 11cc328b5b32..224c160e32fa 100755
>>> --- a/tests/kmstest.py
>>> +++ b/tests/kmstest.py
>>> @@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
>>>
>>>                     min, max = prop.values
>>>                     v = min + int((max - min) * int(v[:-1]) / 100)
>>> -                else:
>>> +                elif v.isnumeric():
>>>                     v = int(v)
>>> +                else:
>>> +                    prop = obj.get_prop(k)
>>> +                    if prop.type != pykms.PropertyType.Enum:
>>> +                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
>>> +                    for value, mode in prop.enums.items():
>>> +                        if mode == v:
>>> +                            v = value
>>> +                            break
>>> +                    else:
>>
>>   Hm, doesn't seem to be correctly aligned?
> 
> That ‘else’ is for ‘for’-loop. Am I missing something here?

   Hm, I don't really know Python, can it actually have else for
a loop?

>>> +                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
>>>
>>>             if not isinstance(v, int):
>>>                 raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')

MBR, Sergey

[...]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] tests: Support enum property type
  2022-07-04  9:00       ` Sergei Shtylyov
@ 2022-07-04  9:13         ` Takanari Hayama
  0 siblings, 0 replies; 13+ messages in thread
From: Takanari Hayama @ 2022-07-04  9:13 UTC (permalink / raw)
  To: Sergei Shtylyov
  Cc: linux-renesas-soc, laurent.pinchart, kieran.bingham+renesas

Hi,

> 2022/07/04 18:00、Sergei Shtylyov <sergei.shtylyov@gmail.com>のメール:
> 
> On 7/4/22 11:53 AM, Takanari Hayama wrote:
> [...]
>>>> Add a support for enum property type to AtomicRequest.
>>>> 
>>>> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
>>>> ---
>>>> tests/kmstest.py | 12 +++++++++++-
>>>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>>> 
>>>> diff --git a/tests/kmstest.py b/tests/kmstest.py
>>>> index 11cc328b5b32..224c160e32fa 100755
>>>> --- a/tests/kmstest.py
>>>> +++ b/tests/kmstest.py
>>>> @@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
>>>> 
>>>>                    min, max = prop.values
>>>>                    v = min + int((max - min) * int(v[:-1]) / 100)
>>>> -                else:
>>>> +                elif v.isnumeric():
>>>>                    v = int(v)
>>>> +                else:
>>>> +                    prop = obj.get_prop(k)
>>>> +                    if prop.type != pykms.PropertyType.Enum:
>>>> +                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
>>>> +                    for value, mode in prop.enums.items():
>>>> +                        if mode == v:
>>>> +                            v = value
>>>> +                            break
>>>> +                    else:
>>> 
>>>  Hm, doesn't seem to be correctly aligned?
>> 
>> That ‘else’ is for ‘for’-loop. Am I missing something here?
> 
>   Hm, I don't really know Python, can it actually have else for
> a loop?

Yes. :)

> When the items are exhausted (which is immediately when the sequence is empty or an iterator raises a StopIteration exception), the suite in the else clause, if present, is executed, and the loop terminates.

From https://docs.python.org/3/reference/compound_stmts.html#the-for-statement

> 
>>>> +                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
>>>> 
>>>>            if not isinstance(v, int):
>>>>                raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')
> 
> MBR, Sergey

Many Thanks,
Takanari Hayama, Ph.D. <taki@igel.co.jp>
IGEL Co., Ltd.
https://www.igel.co.jp/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] tests: Support enum property type
  2022-07-04  2:56 ` [PATCH 1/3] tests: Support enum property type Takanari Hayama
  2022-07-04  8:43   ` Sergei Shtylyov
@ 2022-07-31 16:00   ` Laurent Pinchart
  2022-07-31 16:18     ` Laurent Pinchart
  1 sibling, 1 reply; 13+ messages in thread
From: Laurent Pinchart @ 2022-07-31 16:00 UTC (permalink / raw)
  To: Takanari Hayama; +Cc: linux-renesas-soc, kieran.bingham+renesas

Hi Hayama-san,

Thank you for the patch.

On Mon, Jul 04, 2022 at 11:56:30AM +0900, Takanari Hayama wrote:
> Add a support for enum property type to AtomicRequest.
> 
> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
> ---
>  tests/kmstest.py | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/kmstest.py b/tests/kmstest.py
> index 11cc328b5b32..224c160e32fa 100755
> --- a/tests/kmstest.py
> +++ b/tests/kmstest.py
> @@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
>  
>                      min, max = prop.values
>                      v = min + int((max - min) * int(v[:-1]) / 100)
> -                else:
> +                elif v.isnumeric():
>                      v = int(v)
> +                else:
> +                    prop = obj.get_prop(k)
> +                    if prop.type != pykms.PropertyType.Enum:
> +                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
> +                    for value, mode in prop.enums.items():

I'd replace "mode" with "name" here. Apart from that,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

I'll change this when applying the patch.

> +                        if mode == v:
> +                            v = value
> +                            break
> +                    else:
> +                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
>  
>              if not isinstance(v, int):
>                  raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] kmstest: Support specifying pixel blend mode for planes
  2022-07-04  2:56 ` [PATCH 2/3] kmstest: Support specifying pixel blend mode for planes Takanari Hayama
@ 2022-07-31 16:02   ` Laurent Pinchart
  0 siblings, 0 replies; 13+ messages in thread
From: Laurent Pinchart @ 2022-07-31 16:02 UTC (permalink / raw)
  To: Takanari Hayama; +Cc: linux-renesas-soc, kieran.bingham+renesas

Hi Hayama-san,

Thank you for the patch.

On Mon, Jul 04, 2022 at 11:56:31AM +0900, Takanari Hayama wrote:
> Add an optional pixel blend mode argument to the atomic_plane_set()
> function to  specify the pixel blend mode for the plane.
> 
> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
> ---
>  tests/kmstest.py | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/kmstest.py b/tests/kmstest.py
> index 224c160e32fa..a39ceab3891b 100755
> --- a/tests/kmstest.py
> +++ b/tests/kmstest.py
> @@ -395,7 +395,7 @@ class KMSTest(object):
>          else:
>              return req.commit(0, True)
>  
> -    def atomic_plane_set(self, plane, crtc, source, destination, fb, alpha=None, zpos=None, sync=False):
> +    def atomic_plane_set(self, plane, crtc, source, destination, fb, alpha=None, zpos=None, blendmode=None, sync=False):

I'll add a line break while at it as the line is getting long.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>          req = AtomicRequest(self)
>          req.add(plane, {
>                      'FB_ID': fb.id,
> @@ -413,6 +413,8 @@ class KMSTest(object):
>              req.add(plane, 'alpha', alpha)
>          if zpos is not None:
>              req.add(plane, 'zpos', zpos)
> +        if blendmode is not None:
> +            req.add(plane, 'pixel blend mode', blendmode)
>          if sync:
>              return req.commit_sync()
>          else:

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] tests: Support enum property type
  2022-07-31 16:00   ` Laurent Pinchart
@ 2022-07-31 16:18     ` Laurent Pinchart
  2022-08-01  8:29       ` Takanari Hayama
  0 siblings, 1 reply; 13+ messages in thread
From: Laurent Pinchart @ 2022-07-31 16:18 UTC (permalink / raw)
  To: Takanari Hayama; +Cc: linux-renesas-soc, kieran.bingham+renesas

One more comment.

On Sun, Jul 31, 2022 at 07:01:00PM +0300, Laurent Pinchart wrote:
> Hi Hayama-san,
> 
> Thank you for the patch.
> 
> On Mon, Jul 04, 2022 at 11:56:30AM +0900, Takanari Hayama wrote:
> > Add a support for enum property type to AtomicRequest.
> > 
> > Signed-off-by: Takanari Hayama <taki@igel.co.jp>
> > ---
> >  tests/kmstest.py | 12 +++++++++++-
> >  1 file changed, 11 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tests/kmstest.py b/tests/kmstest.py
> > index 11cc328b5b32..224c160e32fa 100755
> > --- a/tests/kmstest.py
> > +++ b/tests/kmstest.py
> > @@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
> >  
> >                      min, max = prop.values
> >                      v = min + int((max - min) * int(v[:-1]) / 100)
> > -                else:
> > +                elif v.isnumeric():
> >                      v = int(v)
> > +                else:
> > +                    prop = obj.get_prop(k)

I've run this test on a kernel that doesn't support the blend mode
property, and the prop.type access below raised an exception that isn't
very nice to read. If that's fine with you, I'll add

                    if not prop:
                        raise RuntimeError(f'Property {k} not supported by object {obj}')

here to make error messages more readable.

> > +                    if prop.type != pykms.PropertyType.Enum:
> > +                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
> > +                    for value, mode in prop.enums.items():
> 
> I'd replace "mode" with "name" here. Apart from that,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> I'll change this when applying the patch.
> 
> > +                        if mode == v:
> > +                            v = value
> > +                            break
> > +                    else:
> > +                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
> >  
> >              if not isinstance(v, int):
> >                  raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] tests: Add pixel blend mode test
  2022-07-04  2:56 ` [PATCH 3/3] tests: Add pixel blend mode test Takanari Hayama
@ 2022-07-31 18:50   ` Laurent Pinchart
  0 siblings, 0 replies; 13+ messages in thread
From: Laurent Pinchart @ 2022-07-31 18:50 UTC (permalink / raw)
  To: Takanari Hayama; +Cc: linux-renesas-soc, kieran.bingham+renesas

Hi Hayama-san,

Thank you for the patch.

On Mon, Jul 04, 2022 at 11:56:32AM +0900, Takanari Hayama wrote:
> Add a test that blends a plane with different pixel blend modes.
> 
> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
> ---
>  tests/kms-test-plane-blendmode.py | 100 ++++++++++++++++++++++++++++++
>  1 file changed, 100 insertions(+)
>  create mode 100755 tests/kms-test-plane-blendmode.py
> 
> diff --git a/tests/kms-test-plane-blendmode.py b/tests/kms-test-plane-blendmode.py
> new file mode 100755
> index 000000000000..a9c009b74a8c
> --- /dev/null
> +++ b/tests/kms-test-plane-blendmode.py
> @@ -0,0 +1,100 @@
> +#!/usr/bin/python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# SPDX-FileCopyrightText: 2022 Renesas Electronics Corporation
> +
> +import kmstest
> +import pykms
> +
> +class PlaneBlendModeTest(kmstest.KMSTest):
> +    """Test composition in different blend modes."""
> +
> +    def handle_page_flip(self, frame, time):
> +        self.logger.log('Page flip complete')
> +
> +    def find_pipeline(self):
> +        # Find a CRTC that has multiple planes with a connected connector
> +        for connector in self.output_connectors():
> +            # Skip disconnected connectors
> +            if not connector.connected():
> +                continue
> +
> +            # Add the connector to the map
> +            for crtc in connector.get_possible_crtcs():
> +                planes = []
> +                for plane in self.card.planes:
> +                    if plane.supports_crtc(crtc) and plane != crtc.primary_plane:
> +                        planes.append(plane)
> +
> +                if len(planes):
> +                    return crtc, connector, planes
> +
> +        return None, None, None
> +
> +    def main(self):
> +        self.start('composition with blend modes')
> +
> +        crtc, connector, planes = self.find_pipeline()
> +        if crtc is None:
> +            self.skip('no suitable pipeline')
> +            return
> +
> +        # Get the default mode
> +        try:
> +            mode = connector.get_default_mode()
> +        except KeyError:
> +            self.skip('no mode available')
> +            return
> +
> +        self.logger.log(f'Testing connector {connector.fullname}, CRTC {crtc.id}, '
> +                        f'mode {mode.name} with {len(planes)} planes '
> +                        f'(P: {crtc.primary_plane.id}, O: {[plane.id for plane in planes]})')
> +
> +        # Create a primary plane

This only creates a framebuffer, not a plane, so I'd write

	# Create a frame buffer for the primary plane

and name the variable fb_primary.

> +        primary = pykms.DumbFramebuffer(self.card, mode.hdisplay, mode.vdisplay, 'XR24')
> +        pykms.draw_test_pattern(primary)
> +        #pykms.draw_rect(primary, 0, 0, mode.hdisplay, mode.vdisplay, pykms.RGB(0, 0, 255))

This line can be dropped.

> +
> +        # Set the mode with a primary plane
> +        ret = self.atomic_crtc_mode_set(crtc, connector, mode, primary)
> +        if ret < 0:
> +            self.fail(f'atomic mode set failed with {ret}')
> +            return
> +
> +	# Create a overlay plane (half of the screen size)

Small indentation issue, this should use spaces instead of tabs. As
above, I'd write

	# Create a frame buffer for the overlay planes (half of the screen size)

and name the variable fb_overlay.

I would also create both frame buffers before setting the mode.

> +        fb = pykms.DumbFramebuffer(self.card, mode.hdisplay // 2, mode.vdisplay, 'AR24')
> +        self.logger.log(f'Create fb: {fb} ({fb.width}x{fb.height})')
> +        width = mode.hdisplay // 4
> +        height = mode.vdisplay // 5
> +        for n in range(0, 5):
> +            v = 255 - 63 * n
> +            pykms.draw_rect(fb, 0, height * n, width, height, pykms.RGB(v, 255, 255, 255))
> +            pykms.draw_rect(fb, width, height * n, width, height, pykms.RGB(v, v, v, v))
> +
> +        self.run(3)
> +
> +        # Add all other planes one by one

You're only adding a second plane, so

        # Add the overlay plane, testing all blend modes sequentially

> +        source = kmstest.Rect(0, 0, fb.width, fb.height)
> +        destination = kmstest.Rect(fb.width, 0, fb.width, fb.height)
> +        alpha = '50%'
> +        for blendmode in ('Pre-multiplied', 'Coverage', 'None'):
> +            pykms.draw_text(fb, 10, 10, f'alpha={alpha}, mode={blendmode}          ', pykms.white)
> +            ret = self.atomic_plane_set(planes[1], crtc, source, destination, fb, alpha=alpha, blendmode=blendmode)

A bit of line wrap would be nice.

I'll fix thse small issues when applying the patches.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +            if ret < 0:
> +                self.fail(f'atomic plane set failed with {ret}')
> +                break
> +
> +            self.logger.log(f'Adding plane {planes[1].id} with blendmode {blendmode}')
> +            self.run(1)
> +
> +            if self.flips == 0:
> +                self.fail('No page flip registered')
> +                break
> +
> +            self.run(3)
> +
> +        else:
> +            self.success()
> +
> +        self.atomic_crtc_disable(crtc)
> +
> +PlaneBlendModeTest().execute()

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] tests: Support enum property type
  2022-07-31 16:18     ` Laurent Pinchart
@ 2022-08-01  8:29       ` Takanari Hayama
  0 siblings, 0 replies; 13+ messages in thread
From: Takanari Hayama @ 2022-08-01  8:29 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: linux-renesas-soc, kieran.bingham+renesas

Hi Laurent,

Thank you for reviewing the patches.

> 2022/08/01 1:18、Laurent Pinchart <laurent.pinchart@ideasonboard.com>のメール:
> 
> One more comment.
> 
> On Sun, Jul 31, 2022 at 07:01:00PM +0300, Laurent Pinchart wrote:
>> Hi Hayama-san,
>> 
>> Thank you for the patch.
>> 
>> On Mon, Jul 04, 2022 at 11:56:30AM +0900, Takanari Hayama wrote:
>>> Add a support for enum property type to AtomicRequest.
>>> 
>>> Signed-off-by: Takanari Hayama <taki@igel.co.jp>
>>> ---
>>> tests/kmstest.py | 12 +++++++++++-
>>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>> 
>>> diff --git a/tests/kmstest.py b/tests/kmstest.py
>>> index 11cc328b5b32..224c160e32fa 100755
>>> --- a/tests/kmstest.py
>>> +++ b/tests/kmstest.py
>>> @@ -269,8 +269,18 @@ class AtomicRequest(pykms.AtomicReq):
>>> 
>>>                     min, max = prop.values
>>>                     v = min + int((max - min) * int(v[:-1]) / 100)
>>> -                else:
>>> +                elif v.isnumeric():
>>>                     v = int(v)
>>> +                else:
>>> +                    prop = obj.get_prop(k)
> 
> I've run this test on a kernel that doesn't support the blend mode
> property, and the prop.type access below raised an exception that isn't
> very nice to read. If that's fine with you, I'll add
> 
>                    if not prop:
>                        raise RuntimeError(f'Property {k} not supported by object {obj}')
> 
> here to make error messages more readable.

Right. That makes more sense.

> 
>>> +                    if prop.type != pykms.PropertyType.Enum:
>>> +                        raise RuntimeError(f'Unsupported property type {prop.type} for value {v}')
>>> +                    for value, mode in prop.enums.items():
>> 
>> I'd replace "mode" with "name" here. Apart from that,
>> 
>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>> 
>> I'll change this when applying the patch.

Thank you.

>> 
>>> +                        if mode == v:
>>> +                            v = value
>>> +                            break
>>> +                    else:
>>> +                        raise RuntimeError(f'Enum value with name "{v}" not found in property {k}')
>>> 
>>>             if not isinstance(v, int):
>>>                 raise RuntimeError(f'Unsupported value type {type(v)} for property {k}')
> 
> -- 
> Regards,
> 
> Laurent Pinchart

Cheers,
Takanari Hayama, Ph.D. <taki@igel.co.jp>
IGEL Co., Ltd.
https://www.igel.co.jp/


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-08-01  8:29 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-04  2:56 [PATCH 0/3] Test pixel blend mode Takanari Hayama
2022-07-04  2:56 ` [PATCH 1/3] tests: Support enum property type Takanari Hayama
2022-07-04  8:43   ` Sergei Shtylyov
2022-07-04  8:53     ` Takanari Hayama
2022-07-04  9:00       ` Sergei Shtylyov
2022-07-04  9:13         ` Takanari Hayama
2022-07-31 16:00   ` Laurent Pinchart
2022-07-31 16:18     ` Laurent Pinchart
2022-08-01  8:29       ` Takanari Hayama
2022-07-04  2:56 ` [PATCH 2/3] kmstest: Support specifying pixel blend mode for planes Takanari Hayama
2022-07-31 16:02   ` Laurent Pinchart
2022-07-04  2:56 ` [PATCH 3/3] tests: Add pixel blend mode test Takanari Hayama
2022-07-31 18:50   ` Laurent Pinchart

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.