Closed Bug 311980 Opened 19 years ago Closed 17 years ago

Speed up _cairo_fixed_from_double

Categories

(Core Graveyard :: GFX, defect)

defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: tor, Assigned: tor)

Details

Attachments

(1 file)

Cairo's current implementation of gradients makes heavy use of
_cairo_fixed_from_double, which vc6's compiler can't seem to do a good job of
optimizing.  Using a neat trick to speed it up improved our gradient performance
tests by about 25% on windows.
Attachment #199113 - Flags: review?(cworth)
The patch looks pretty good to me. I haven't tested it much yet, but the
approach seems fine, (I'm glad to see a link to an explanation in the patch).
And obviously, the fix has a nice performance impact as you have measured.

The patch does make assumptions about the floating-point representation, so
before I commit this to cairo proper, I'd like to see this version made
conditional on a configure-time check so we have better assurance that it will
actually work on a wide range of platforms.
Drivers aren't going to allow this on the branch, and there are plans to change
how cairo implements gradients going forward.  Closing as WONTFIX.
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → WONTFIX
Attachment #199113 - Flags: review?(cworth)
Won't _cairo_fixed_from_double get used a good bit any time we call into cairo from layout, esp if we change to float for nscoord?  Might be worth it to check this in anyway; cairo can use all the perf help it can get....
Yeah, this is quite good; I'm seeing fixed_from_double a lot in the profiles.  It should also be inline; right now it's being called as a function everywhere.
Status: RESOLVED → REOPENED
Resolution: WONTFIX → ---
Turning it into a macro would involve a sweep through the cairo tree modifying the  calls to _cairo_fixed_from_double in argument lists, since we need to create a block for the temporary variable used to shift types.
(In reply to comment #4)
> Won't _cairo_fixed_from_double get used a good bit any time we call into cairo
> from layout, esp if we change to float for nscoord?
> 

no.  this is an internal cairo function.  all cairo APIs take doubles so anything from layout gets converted in to a double and then to fixed for some things inside cairo.
(In reply to comment #6)
> Turning it into a macro would involve a sweep through the cairo tree modifying
> the  calls to _cairo_fixed_from_double in argument lists, since we need to
> create a block for the temporary variable used to shift types.

My plan was to just define all the cairo-fixed functions as inline in the header file; "static inline" isn't valid, but I think that's effectively the semantics we'd get.
> anything from layout gets converted in to a double and then to fixed for some
> things inside cairo.

Right.  And the latter conversion should be fast if we can make it so.
Daniel Amelang got some code checked into cairo for this.
Yep, this has been fixed.
Status: REOPENED → RESOLVED
Closed: 19 years ago17 years ago
Resolution: --- → FIXED
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: