[Intel-gfx] [PATCH] drm/i915: Add BXT Sprite plane fractional scalings
Nabendu Maiti
nabendu.bikash.maiti at intel.com
Thu Nov 26 10:19:43 PST 2015
On 11/18/2015 06:49 PM, Ville Syrjälä wrote:
> On Wed, Nov 18, 2015 at 06:37:17PM +0530, Maiti, Nabendu Bikash wrote:
>>
>> On 11/18/2015 5:41 PM, Ville Syrjälä wrote:
>>> On Wed, Nov 18, 2015 at 05:13:01PM +0530, Nabendu Maiti wrote:
>>>> On older platforms scalers/cliping used to provide destination size an
>>>> exact multiple of src size.
>>>> Gen-9 and above support fractional ratio of dst/src so that source is
>>>> not manipulated to meet the exact multiple factor.
>>>>
>>>> Signed-off-by: Nabendu Maiti <nabendu.bikash.maiti at intel.com>
>>>> ---
>>>> drivers/gpu/drm/i915/intel_sprite.c | 48 +++++++++++++++++++++----------------
>>>> 1 file changed, 28 insertions(+), 20 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
>>>> index 2b96f33..e8c17ae 100644
>>>> --- a/drivers/gpu/drm/i915/intel_sprite.c
>>>> +++ b/drivers/gpu/drm/i915/intel_sprite.c
>>>> @@ -813,29 +813,37 @@ intel_check_sprite_plane(struct drm_plane *plane,
>>>> crtc_h = drm_rect_height(dst);
>>>>
>>>> if (state->visible) {
>>>> - /* check again in case clipping clamped the results */
>>>> - hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
>>>> - if (hscale < 0) {
>>>> - DRM_DEBUG_KMS("Horizontal scaling factor out of limits\n");
>>>> - drm_rect_debug_print("src: ", src, true);
>>>> - drm_rect_debug_print("dst: ", dst, false);
>>>> -
>>>> - return hscale;
>>>> - }
>>>>
>>>> - vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
>>>> - if (vscale < 0) {
>>>> - DRM_DEBUG_KMS("Vertical scaling factor out of limits\n");
>>>> - drm_rect_debug_print("src: ", src, true);
>>>> - drm_rect_debug_print("dst: ", dst, false);
>>>> + /* Gen 9 and above has fractional scaling support */
>>>> + if (INTEL_INFO(plane->dev)->gen < 9) {
>>>>
>>>> - return vscale;
>>>> - }
>>>> + /* check again in case clipping clamped the results */
>>>> + hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
>>>> + if (hscale < 0) {
>>>> + DRM_DEBUG_KMS("Horizontal scaling factor out of limits\n");
>>>> + drm_rect_debug_print("src: ", src, true);
>>>> + drm_rect_debug_print("dst: ", dst, false);
>>>> +
>>>> + return hscale;
>>>> + }
>>>> +
>>>> + vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
>>>> + if (vscale < 0) {
>>>> + DRM_DEBUG_KMS("Vertical scaling factor out of limits\n");
>>>> + drm_rect_debug_print("src: ", src, true);
>>>> + drm_rect_debug_print("dst: ", dst, false);
>>>>
>>>> - /* Make the source viewport size an exact multiple of the scaling factors. */
>>>> - drm_rect_adjust_size(src,
>>>> - drm_rect_width(dst) * hscale - drm_rect_width(src),
>>>> - drm_rect_height(dst) * vscale - drm_rect_height(src));
>>>> + return vscale;
>>>> + }
>>>> +
>>>> + /*
>>>> + * Make the source viewport size an exact
>>>> + * multiple of the scaling factors.
>>>> + */
>>>> + drm_rect_adjust_size(src,
>>>> + drm_rect_width(dst) * hscale - drm_rect_width(src),
>>>> + drm_rect_height(dst) * vscale - drm_rect_height(src));
>>>> + }
>>> NAK. This code just makes sure the actual scaling ratio matches what we
>>> calculated. As in there may have been some amount of rounding involved
>>> etc.
>>>
>>> The part you actually want to change is what comes after this where we
>>> throw away the fractional part of the coordinates. And then you need to
>>> change the actual hw programming so that we actually feed the sub-pixel
>>> coordinates to the hardware.
>> In line
>>
>> drm_rect_adjust_size(src,
>> + drm_rect_width(dst) * hscale - drm_rect_width(src),
>> + drm_rect_height(dst) * vscale - drm_rect_height(src));
>>
>> I think we throw away the fractional part,
> No, we don't.
It get changed for example src size 400x596 to destination 1055x700.
then i.e. u32/int hscale = (src * 0x10000)/dst = 0x1900000/0x41f =
26214400/1055= 24847 (actually 24847.772511848)
so in next line it get modified .
drm_rect_adjust_size(src,
+ drm_rect_width(dst) * hscale - drm_rect_width(src),
+ drm_rect_height(dst) * vscale - drm_rect_height(src)); ,
Src width become 399, which is used for further calculation & commiting.
following logs also shows same result
[ 144.749628] [drm:intel_check_sprite_plane] NBM T00: src- x1:y1-> 0:0
x2:y2->26214400:39059456
[ 144.749687] [drm:intel_check_sprite_plane] NBM T01: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.749747] [drm:intel_check_sprite_plane] NBM T02: Clip- x1:y1-> 0:0
x2:y2->1080:1920
[ 144.749862] [drm:intel_check_sprite_plane] NBM T02a: src- x1:y1-> 0:0
x2:y2->26214400:39059456
[ 144.749924] [drm:intel_check_sprite_plane] NBM T02b: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.749983] [drm:intel_check_sprite_plane] NBM T03: hscale: 24847
vscale: 55799
[ 144.750040] [drm:intel_check_sprite_plane] NBM T04: src- x1:y1-> 0:0
x2:y2->26214400:39059456
[ 144.750143] [drm:intel_check_sprite_plane] NBM T05: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.750199] [drm:intel_check_sprite_plane] NBM T05a: Clip- x1:y1-> 0:0
x2:y2->1080:1920
[ 144.750258] [drm:drm_rect_clip_scaled] NBM K00: src- x1:y1-> 0:0
h->26214400:39059456
[ 144.750312] [drm:drm_rect_clip_scaled] NBM K01: dst- x1:y1-> 0:0
h->1055:700
[ 144.750312] [ 144.750423] [drm:intel_check_sprite_plane] NBM T05b:
src- x1:y1-> 0:0 x2:y2->26214400:39059456
[ 144.750480] [drm:intel_check_sprite_plane] NBM T05c: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.750535] [drm:intel_check_sprite_plane] NBM T05d: Clip- x1:y1-> 0:0
x2:y2->1080:1920
[ 144.750591] [drm:intel_check_sprite_plane] NBM T06-A: src- x1:y1->
408:78 x2:y2->26213993:39059378
[ 144.750649] [drm:intel_check_sprite_plane] NBM T06-B: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.750706] [drm:intel_check_sprite_plane] NBM T06_0: src- x1:y1->
0:399 x2:y2->399:0
[ 144.750761] [drm:intel_check_sprite_plane] NBM T07_0: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.750816] [drm:intel_check_sprite_plane] NBM T07a_0: vscale: d9f7
hscale:610f
[ 144.750871] [drm:intel_check_sprite_plane] NBM T06: src- x1:y1->
408:78 x2:y2->26213993:39059378
[ 144.750928] [drm:intel_check_sprite_plane] NBM T07: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.751001] [drm:intel_check_sprite_plane] NBM T07a: vscale: d9f7
hscale:610f
[ 144.751097] [drm:intel_check_sprite_plane] NBM T08: src- x1:y1-> 0:0
x2:y2->26148864:38993920
[ 144.751174] [drm:intel_check_sprite_plane] NBM T09: dst- x1:y1-> 0:0
x2:y2->1055:700
[ 144.751230] [drm:intel_plane_atomic_check] NBM L02: src- x1:y1-> 0:0
h->26148864:38993920
[ 144.751291] [drm:intel_plane_atomic_calc_changes] NBM M0: src- x1:y1->
0:0 x2:y2->18f0000:2530000
[ 144.751291] [drm:intel_plane_atomic_calc_changes] NBM M11: src-
x1:y1-> 0:0 x2:y2->18f0000:2530000
>
>> which modifies the src,rectangle. In commit we use the modified state->src size.
>>
>>>>
>>>> drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16,
>>>> state->base.rotation);
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> Intel-gfx mailing list
>>>> Intel-gfx at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list