Re: [cairo] help building cairo on windows
Andrea Canciani <[email protected]>
| Newsgroups | gmane.comp.graphics.pixman,gmane.comp.lib.cairo |
|---|---|
| Message-ID | <CAN_5=BDLwS7UEwqWnuLE_TTdUJcAcSHtPzyBwuMivUAMULOQZA@mail.gmail.com> |
This reminds me that I have some patches to improve building pixman on win32: http://cgit.freedesktop.org/~ranma42/pixman/commit/?h=wip/simpleops-to-master Soren, is it ok if I push the attached patches? I will work a little more on simpleops before proposing it again (in particular, I'd like to make it behave like the gstreamer git submodules and I need to investigate how it is integrated with packaging and releasing), but the first two commits in the branch should be ok for merge regardless of simpleops. Andrea On Mon, Sep 10, 2012 at 8:17 PM, Dimiter 'malkia' Stanev <[email protected]> wrote: > On 9/10/2012 7:04 AM, Cosmin Apreutesei wrote: >> >> Hi, >> >> I have to build cairo on windows because I want to use the recording >> surface and I can't find binaries above 1.10 anywhere on the net (till >> now I have used the binaries from GTK but these are old and the >> recording surface doesn't work with those). >> >> Trying to build pixman with: >> >>> make CFG=debug -f Makefile.win32 >> >> >> gives me: >> >> pixman-mmx.c(545) : error C2143: syntax error : missing ';' before 'type' >> >> and then 100 syntax errors like that (other c files compile ok until >> the mmx one). >> >> The sources were pulled today from git. The environment is VSE2008. >> make is 3.81 from mingw (I also had to throw in pkg-config binaries + >> dependencies from GTK). >> >> I also tried to build the latest pixman (0.26.2) with the same command >> but it failed with: >> >> Entering directory `/x/work/pixman-0.26.2/test' >> Makefile.win32: No such file or directory >> >> I also tried building with mozilla-build from the mingw bash prompt, >> with the same results. >> >> >> So what's the best (preferably from cmdline) way to build pixman and >> cairo under windows? And which is the best version? The release or the >> git one? >> >> Btw, if anyone has an up-to-date cairo.dll that would work for me too. >> > > Hi Cosmin, > > With this patch you should be able to compile. > > Thanks, > Dimiter 'malkia' Stanev > > pixman-mmx.diff > > diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c > index 74a5e87..9e597db 100644 > --- a/pixman/pixman-mmx.c > +++ b/pixman/pixman-mmx.c > @@ -541,7 +541,7 @@ expand565 (__m64 pixel, int pos) > static force_inline void > expand_4xpacked565 (__m64 vin, __m64 *vout0, __m64 *vout1, int full_alpha) > { > - __m64 t0, t1, alpha = _mm_setzero_si64 ();; > + __m64 t0, t1, alpha = _mm_setzero_si64 (); > __m64 r = _mm_and_si64 (vin, MC (expand_565_r)); > __m64 g = _mm_and_si64 (vin, MC (expand_565_g)); > __m64 b = _mm_and_si64 (vin, MC (expand_565_b)); > @@ -1902,22 +1902,22 @@ mmx_composite_over_8888_0565 > (pixman_implementation_t *imp, > while (w >= 4) > { > __m64 vdest = *(__m64 *)dst; > - __m64 v0, v1, v2, v3; > + __m64 v0, v1, v2, v3, vsrc0, vsrc1, vsrc2, vsrc3; > > expand_4x565 (vdest, &v0, &v1, &v2, &v3, 0); > > - __m64 vsrc0 = load8888 ((src + 0)); > - __m64 vsrc1 = load8888 ((src + 1)); > - __m64 vsrc2 = load8888 ((src + 2)); > - __m64 vsrc3 = load8888 ((src + 3)); > - > + vsrc0 = load8888 ((src + 0)); > + vsrc1 = load8888 ((src + 1)); > + vsrc2 = load8888 ((src + 2)); > + vsrc3 = load8888 ((src + 3)); > + > v0 = over (vsrc0, expand_alpha (vsrc0), v0); > v1 = over (vsrc1, expand_alpha (vsrc1), v1); > v2 = over (vsrc2, expand_alpha (vsrc2), v2); > v3 = over (vsrc3, expand_alpha (vsrc3), v3); > - > + > *(__m64 *)dst = pack_4x565 (v0, v1, v2, v3); > - > + > w -= 4; > dst += 4; > src += 4; > @@ -2454,22 +2454,22 @@ mmx_composite_over_n_8_0565 (pixman_implementation_t > *imp, > else if (m0 | m1 | m2 | m3) > { > __m64 vdest = *(__m64 *)dst; > - __m64 v0, v1, v2, v3; > + __m64 v0, v1, v2, v3, vm0, vm1, vm2, vm3; > > expand_4x565 (vdest, &v0, &v1, &v2, &v3, 0); > > - __m64 vm0 = to_m64 (m0); > + vm0 = to_m64 (m0); > v0 = in_over (vsrc, vsrca, expand_alpha_rev (vm0), v0); > - > - __m64 vm1 = to_m64 (m1); > + > + vm1 = to_m64 (m1); > v1 = in_over (vsrc, vsrca, expand_alpha_rev (vm1), v1); > - > - __m64 vm2 = to_m64 (m2); > + > + vm2 = to_m64 (m2); > v2 = in_over (vsrc, vsrca, expand_alpha_rev (vm2), v2); > - > - __m64 vm3 = to_m64 (m3); > + > + vm3 = to_m64 (m3); > v3 = in_over (vsrc, vsrca, expand_alpha_rev (vm3), v3); > - > + > *(__m64 *)dst = pack_4x565 (v0, v1, v2, v3);; > } > > @@ -3545,32 +3545,35 @@ mmx_composite_over_reverse_n_8888 > (pixman_implementation_t *imp, > > #define BILINEAR_INTERPOLATE_ONE_PIXEL(pix) > \ > do { > \ > + __m64 t_hi, t_lo, b_hi, b_lo, hi, lo; \ > /* fetch 2x2 pixel block into 2 mmx registers */ > \ > __m64 t = ldq_u ((__m64 *)&src_top [pixman_fixed_to_int (vx)]); > \ > __m64 b = ldq_u ((__m64 *)&src_bottom [pixman_fixed_to_int (vx)]); > \ > vx += unit_x; > \ > /* vertical interpolation */ > \ > - __m64 t_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (t, mm_zero), mm_wt); > \ > - __m64 t_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (t, mm_zero), mm_wt); > \ > - __m64 b_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (b, mm_zero), mm_wb); > \ > - __m64 b_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (b, mm_zero), mm_wb); > \ > - __m64 hi = _mm_add_pi16 (t_hi, b_hi); > \ > - __m64 lo = _mm_add_pi16 (t_lo, b_lo); > \ > + t_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (t, mm_zero), mm_wt); > \ > + t_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (t, mm_zero), mm_wt); > \ > + b_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (b, mm_zero), mm_wb); > \ > + b_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (b, mm_zero), mm_wb); > \ > + hi = _mm_add_pi16 (t_hi, b_hi); > \ > + lo = _mm_add_pi16 (t_lo, b_lo); > \ > if (BILINEAR_INTERPOLATION_BITS < 8) > \ > { > \ > + __m64 p, q; \ > /* calculate horizontal weights */ > \ > __m64 mm_wh = _mm_add_pi16 (mm_addc7, _mm_xor_si64 (mm_xorc7, > \ > _mm_srli_pi16 (mm_x, > \ > 16 - > BILINEAR_INTERPOLATION_BITS))); \ > mm_x = _mm_add_pi16 (mm_x, mm_ux); > \ > /* horizontal interpolation */ > \ > - __m64 p = _mm_unpacklo_pi16 (lo, hi); > \ > - __m64 q = _mm_unpackhi_pi16 (lo, hi); > \ > + p = _mm_unpacklo_pi16 (lo, hi); > \ > + q = _mm_unpackhi_pi16 (lo, hi); > \ > lo = _mm_madd_pi16 (p, mm_wh); > \ > hi = _mm_madd_pi16 (q, mm_wh); > \ > } > \ > else > \ > { > \ > + __m64 mm_lo_lo, mm_lo_hi, mm_hi_lo, mm_hi_hi; > \ > /* calculate horizontal weights */ > \ > __m64 mm_wh_lo = _mm_sub_pi16 (mm_BSHIFT, _mm_srli_pi16 (mm_x, > \ > 16 - BILINEAR_INTERPOLATION_BITS)); > \ > @@ -3578,10 +3581,10 @@ do { > \ > 16 - BILINEAR_INTERPOLATION_BITS); > \ > mm_x = _mm_add_pi16 (mm_x, mm_ux); > \ > /* horizontal interpolation */ > \ > - __m64 mm_lo_lo = _mm_mullo_pi16 (lo, mm_wh_lo); > \ > - __m64 mm_lo_hi = _mm_mullo_pi16 (hi, mm_wh_hi); > \ > - __m64 mm_hi_lo = _mm_mulhi_pu16 (lo, mm_wh_lo); > \ > - __m64 mm_hi_hi = _mm_mulhi_pu16 (hi, mm_wh_hi); > \ > + mm_lo_lo = _mm_mullo_pi16 (lo, mm_wh_lo); > \ > + mm_lo_hi = _mm_mullo_pi16 (hi, mm_wh_hi); > \ > + mm_hi_lo = _mm_mulhi_pu16 (lo, mm_wh_lo); > \ > + mm_hi_hi = _mm_mulhi_pu16 (hi, mm_wh_hi); > \ > lo = _mm_add_pi32 (_mm_unpacklo_pi16 (mm_lo_lo, mm_hi_lo), > \ > _mm_unpacklo_pi16 (mm_lo_hi, mm_hi_hi)); > \ > hi = _mm_add_pi32 (_mm_unpackhi_pi16 (mm_lo_lo, mm_hi_lo), > \ > > -- > cairo mailing list > cairo-+tBg5+tf/GYFvLozru7NVdi2O/[email protected] > http://lists.cairographics.org/mailman/listinfo/cairo _______________________________________________ Pixman mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/pixman
0002-build-Improve-win32-build-system.patch
(application/octet-stream, 2.7 KB)
From 0a82c2f1aaa4d8fa7a15f50fc0c3d375913bcf41 Mon Sep 17 00:00:00 2001 From: Andrea Canciani <[email protected]> Date: Thu, 21 Jun 2012 06:07:07 +0200 Subject: [PATCH 02/15] build: Improve win32 build system Handle cross-directory dependencies using PHONY targets and clean up some redundancies. --- Makefile.win32 | 14 +++++++------- Makefile.win32.common | 4 +++- pixman/Makefile.win32 | 2 ++ test/Makefile.win32 | 10 +++++++--- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Makefile.win32 b/Makefile.win32 index 91cd12a..c3ca3bc 100644 --- a/Makefile.win32 +++ b/Makefile.win32 @@ -3,23 +3,23 @@ default: all top_srcdir = . include $(top_srcdir)/Makefile.win32.common -# Recursive targets -pixman_r: +all: pixman test + +pixman: @$(MAKE) -C pixman -f Makefile.win32 -test_r: +test: @$(MAKE) -C test -f Makefile.win32 clean_r: @$(MAKE) -C pixman -f Makefile.win32 clean @$(MAKE) -C test -f Makefile.win32 clean -check_r: +check: @$(MAKE) -C test -f Makefile.win32 check -# Base targets -all: test_r clean: clean_r -check: check_r + +.PHONY: all pixman test clean check diff --git a/Makefile.win32.common b/Makefile.win32.common index 56c3593..777f94c 100644 --- a/Makefile.win32.common +++ b/Makefile.win32.common @@ -46,9 +46,11 @@ endif endif -$(CFG_VAR)/%.obj: %.c $(BUILT_SOURCES) +$(CFG_VAR)/%.obj: %.c $(libpixman_headers) @mkdir -p $(CFG_VAR) @$(CC) -c $(PIXMAN_CFLAGS) -Fo"$@" $< clean: inform @$(RM) $(CFG_VAR)/*.{exe,ilk,lib,obj,pdb} $(BUILT_SOURCES) || exit 0 + +.PHONY: inform clean diff --git a/pixman/Makefile.win32 b/pixman/Makefile.win32 index 381f2cd..57ed7a5 100644 --- a/pixman/Makefile.win32 +++ b/pixman/Makefile.win32 @@ -64,3 +64,5 @@ endif # pixman linking $(CFG_VAR)/$(LIBRARY).lib: $(OBJECTS) @$(AR) $(PIXMAN_ARFLAGS) -OUT:$@ $^ + +.PHONY: all informMMX informSSE2 diff --git a/test/Makefile.win32 b/test/Makefile.win32 index c88d087..b6254a3 100644 --- a/test/Makefile.win32 +++ b/test/Makefile.win32 @@ -16,9 +16,9 @@ OBJECTS = $(patsubst %.c, $(CFG_VAR)/%.obj, $(SOURCES)) TESTS = $(patsubst %, $(CFG_VAR)/%.exe, $(TESTPROGRAMS)) BENCHS = $(patsubst %, $(CFG_VAR)/%.exe, $(BENCHMARKS)) -all: inform $(TESTS) $(BENCHS) +all: pixman inform $(TESTS) $(BENCHS) -check: inform $(TESTS) +check: pixman inform $(TESTS) @failures=0 ; \ total=0 ; \ for test in $(TESTS) ; \ @@ -46,5 +46,9 @@ $(CFG_VAR)/libutils.lib: $(libutils_OBJECTS) $(CFG_VAR)/%.exe: $(CFG_VAR)/%.obj $(TEST_LDADD) @$(LD) $(PIXMAN_LDFLAGS) -OUT:$@ $^ -$(top_builddir)/pixman/$(CFG_VAR)/$(LIBRARY).lib: +$(top_builddir)/pixman/$(CFG_VAR)/$(LIBRARY).lib: pixman + +pixman: @$(MAKE) -C $(top_builddir)/pixman -f Makefile.win32 + +.PHONY: all check pixman -- 1.7.5.1
0001-mmx-Fix-x86-build-on-MSVC.patch
(application/octet-stream, 4.3 KB)
From c1b943cdcdb4de12a7f93eb9162858eea0bfa713 Mon Sep 17 00:00:00 2001 From: Andrea Canciani <[email protected]> Date: Tue, 17 Jul 2012 16:14:20 +0200 Subject: [PATCH 01/15] mmx: Fix x86 build on MSVC The MSVC compiler is very strict about variable declarations after statements. Move all the declarations of each block before any statement in the same block to fix multiple instances of: pixman-mmx.c(xxxx) : error C2275: '__m64' : illegal use of this type as an expression --- pixman/pixman-mmx.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-) diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c index 74a5e87..b3a4c5f 100644 --- a/pixman/pixman-mmx.c +++ b/pixman/pixman-mmx.c @@ -541,7 +541,7 @@ expand565 (__m64 pixel, int pos) static force_inline void expand_4xpacked565 (__m64 vin, __m64 *vout0, __m64 *vout1, int full_alpha) { - __m64 t0, t1, alpha = _mm_setzero_si64 ();; + __m64 t0, t1, alpha = _mm_setzero_si64 (); __m64 r = _mm_and_si64 (vin, MC (expand_565_r)); __m64 g = _mm_and_si64 (vin, MC (expand_565_g)); __m64 b = _mm_and_si64 (vin, MC (expand_565_b)); @@ -1903,13 +1903,14 @@ mmx_composite_over_8888_0565 (pixman_implementation_t *imp, { __m64 vdest = *(__m64 *)dst; __m64 v0, v1, v2, v3; + __m64 vsrc0, vsrc1, vsrc2, vsrc3; expand_4x565 (vdest, &v0, &v1, &v2, &v3, 0); - __m64 vsrc0 = load8888 ((src + 0)); - __m64 vsrc1 = load8888 ((src + 1)); - __m64 vsrc2 = load8888 ((src + 2)); - __m64 vsrc3 = load8888 ((src + 3)); + vsrc0 = load8888 ((src + 0)); + vsrc1 = load8888 ((src + 1)); + vsrc2 = load8888 ((src + 2)); + vsrc3 = load8888 ((src + 3)); v0 = over (vsrc0, expand_alpha (vsrc0), v0); v1 = over (vsrc1, expand_alpha (vsrc1), v1); @@ -2455,19 +2456,20 @@ mmx_composite_over_n_8_0565 (pixman_implementation_t *imp, { __m64 vdest = *(__m64 *)dst; __m64 v0, v1, v2, v3; + __m64 vm0, vm1, vm2, vm3; expand_4x565 (vdest, &v0, &v1, &v2, &v3, 0); - __m64 vm0 = to_m64 (m0); + vm0 = to_m64 (m0); v0 = in_over (vsrc, vsrca, expand_alpha_rev (vm0), v0); - __m64 vm1 = to_m64 (m1); + vm1 = to_m64 (m1); v1 = in_over (vsrc, vsrca, expand_alpha_rev (vm1), v1); - __m64 vm2 = to_m64 (m2); + vm2 = to_m64 (m2); v2 = in_over (vsrc, vsrca, expand_alpha_rev (vm2), v2); - __m64 vm3 = to_m64 (m3); + vm3 = to_m64 (m3); v3 = in_over (vsrc, vsrca, expand_alpha_rev (vm3), v3); *(__m64 *)dst = pack_4x565 (v0, v1, v2, v3);; @@ -3548,7 +3550,6 @@ do { \ /* fetch 2x2 pixel block into 2 mmx registers */ \ __m64 t = ldq_u ((__m64 *)&src_top [pixman_fixed_to_int (vx)]); \ __m64 b = ldq_u ((__m64 *)&src_bottom [pixman_fixed_to_int (vx)]); \ - vx += unit_x; \ /* vertical interpolation */ \ __m64 t_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (t, mm_zero), mm_wt); \ __m64 t_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (t, mm_zero), mm_wt); \ @@ -3556,13 +3557,13 @@ do { \ __m64 b_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (b, mm_zero), mm_wb); \ __m64 hi = _mm_add_pi16 (t_hi, b_hi); \ __m64 lo = _mm_add_pi16 (t_lo, b_lo); \ + vx += unit_x; \ if (BILINEAR_INTERPOLATION_BITS < 8) \ { \ /* calculate horizontal weights */ \ __m64 mm_wh = _mm_add_pi16 (mm_addc7, _mm_xor_si64 (mm_xorc7, \ _mm_srli_pi16 (mm_x, \ 16 - BILINEAR_INTERPOLATION_BITS))); \ - mm_x = _mm_add_pi16 (mm_x, mm_ux); \ /* horizontal interpolation */ \ __m64 p = _mm_unpacklo_pi16 (lo, hi); \ __m64 q = _mm_unpackhi_pi16 (lo, hi); \ @@ -3576,7 +3577,6 @@ do { \ 16 - BILINEAR_INTERPOLATION_BITS)); \ __m64 mm_wh_hi = _mm_srli_pi16 (mm_x, \ 16 - BILINEAR_INTERPOLATION_BITS); \ - mm_x = _mm_add_pi16 (mm_x, mm_ux); \ /* horizontal interpolation */ \ __m64 mm_lo_lo = _mm_mullo_pi16 (lo, mm_wh_lo); \ __m64 mm_lo_hi = _mm_mullo_pi16 (hi, mm_wh_hi); \ @@ -3587,6 +3587,7 @@ do { \ hi = _mm_add_pi32 (_mm_unpackhi_pi16 (mm_lo_lo, mm_hi_lo), \ _mm_unpackhi_pi16 (mm_lo_hi, mm_hi_hi)); \ } \ + mm_x = _mm_add_pi16 (mm_x, mm_ux); \ /* shift and pack the result */ \ hi = _mm_srli_pi32 (hi, BILINEAR_INTERPOLATION_BITS * 2); \ lo = _mm_srli_pi32 (lo, BILINEAR_INTERPOLATION_BITS * 2); \ -- 1.7.5.1