Nicolai Hähnle [Sat, 3 Oct 2009 17:30:48 +0000 (19:30 +0200)]
Merge branch 'master' into r300-compiler
Nicolai Hähnle [Sat, 3 Oct 2009 14:18:57 +0000 (16:18 +0200)]
prog_parameter: Document the fact that Size may be > 4
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
Nicolai Hähnle [Sat, 3 Oct 2009 17:20:31 +0000 (19:20 +0200)]
r300g: Do not abort on fragment program compiler error
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
Nicolai Hähnle [Sat, 3 Oct 2009 15:56:51 +0000 (17:56 +0200)]
r300g: Fix memory leak in radeon_texture_from_shared_handle
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
Sedat Dilek [Sat, 3 Oct 2009 16:01:58 +0000 (18:01 +0200)]
r300g: Build in the trace and softpipe driver for xorg state tracker
Same as in src/gallium/winsys/drm/intel/xorg/Makefile
Thanks MrCooper for explanations on IRC
[ Summary amended by Michel Dänzer to clarify that this is related to the xorg
state tracker ]
Michel Dänzer [Sat, 3 Oct 2009 16:01:58 +0000 (18:01 +0200)]
radeon: Cope better with texture images with no miptrees.
Fixes crash with compiz magnifier plugin.
Michel Dänzer [Sat, 3 Oct 2009 16:01:58 +0000 (18:01 +0200)]
swrast: Move up state validation in _swrast_ReadPixels.
This ensures the driver won't map the wrong set of textures.
Michel Dänzer [Sat, 3 Oct 2009 16:01:57 +0000 (18:01 +0200)]
meta: Make sure texImage->TexFormat is valid for CopyTex(Sub)Image.
Nicolai Hähnle [Sat, 3 Oct 2009 15:49:16 +0000 (17:49 +0200)]
r300g: Remove an unnecessarily created pipe buffer (and thus fix a leak)
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
Nicolai Hähnle [Sat, 3 Oct 2009 15:39:32 +0000 (17:39 +0200)]
st/dri: Install APPLE_vertex_array_object functions
Besides from being necessary to use that extension, it also fixes a crash
when deleting the currently bound vertex array object.
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
Nicolai Hähnle [Sat, 3 Oct 2009 15:24:04 +0000 (17:24 +0200)]
r300g: Reset vbo_offset after allocation of a new buffer
This fixes the glxgears bug, among other things.
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
Nicolai Hähnle [Sat, 3 Oct 2009 00:11:02 +0000 (02:11 +0200)]
st/dri: Install ARB_vertex_array_object functions
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
Brian Paul [Fri, 2 Oct 2009 19:59:41 +0000 (13:59 -0600)]
mesa: optimized _mesa_meta_BlitFramebuffer() for src=texture case
If the src renderbuffer is actually a texture, we can directly use that
texture as the src and avoid a copy.
Eric Anholt [Fri, 2 Oct 2009 17:53:56 +0000 (10:53 -0700)]
i965: Use a little stack space to avoid a malloc in wm_get_binding_table.
Eric Anholt [Fri, 2 Oct 2009 00:59:05 +0000 (17:59 -0700)]
mesa: Remove another unexplained Flush call, this time from BindFramebuffer.
Combined with the previous fix, it takes cairo-gl firefox-talos-gfx time
from 120 seconds to 90 seconds on my GM45.
Eric Anholt [Thu, 1 Oct 2009 23:53:12 +0000 (16:53 -0700)]
Revert "Flush driver, not just tnl module."
This reverts commit
df058298e1570eea8712f9bb051f674fab2eaf24. It didn't
explain why it was required, doesnt appear to be required, and is a
significant performance penalty for cairo-gl firefox.
Conflicts:
src/mesa/main/fbobject.c
Eric Anholt [Fri, 2 Oct 2009 01:07:57 +0000 (18:07 -0700)]
intel: Remove an unexplained flush from intelClearWithBlit.
Alex Deucher [Fri, 2 Oct 2009 18:25:52 +0000 (14:25 -0400)]
r600: remove support for host-based ibs
no longer used now that the hw supports this natively.
Also, clean up some formatting.
Keith Whitwell [Fri, 2 Oct 2009 14:36:47 +0000 (15:36 +0100)]
mesa/st: don't reuse vertex buffers for bitmap, clear quads
Currently using max_slots > 1 will cause synchronous rendering
if the driver flushes its command buffers between one bitmap and the
next.
Need to improve buffer_write to allow NO_WAIT (as well as no_flush)
updates to buffers where we know there is no conflict with previous
data.
Michel Dänzer [Fri, 2 Oct 2009 16:13:26 +0000 (18:13 +0200)]
st/xorg: Use PIPE_TRANSFER_MAP_DIRECTLY flag in EXA PrepareAccess hook.
Propagate NULL return value.
This also allows removing the DRM_MODE_FEATURE_DIRTYFB specific pixmap
management hacks.
Michel Dänzer [Fri, 2 Oct 2009 16:13:26 +0000 (18:13 +0200)]
gallium: Add PIPE_TRANSFER_MAP_DIRECTLY usage flag.
Asks the driver to map the texture storage directly or return NULL if that's
not possible.
Michel Dänzer [Fri, 2 Oct 2009 16:13:26 +0000 (18:13 +0200)]
gallium: Preparations for adding more PIPE_TRANSFER_* usage flags.
Always test for PIPE_TRANSFER_READ/WRITE using the bit-wise and operator, and
add a pipe_transfer_buffer_flags() helper for getting the buffer usage flags
corresponding to them.
Brian Paul [Fri, 2 Oct 2009 14:55:25 +0000 (08:55 -0600)]
intel: wrap _mesa_meta_GenerateMipmap()
Need to check if we'll take the software path so which requires mapping the
src texture image.
Fixes crash in piglit gen-compressed-teximage, bug 24219. However, the
test still does not pass (it may never have).
Brian Paul [Fri, 2 Oct 2009 14:54:55 +0000 (08:54 -0600)]
mesa: added _mesa_meta_check_generate_mipmap_fallback()
Younes Manton [Fri, 2 Oct 2009 02:25:46 +0000 (22:25 -0400)]
g3dvl: Formatting.
Younes Manton [Fri, 2 Oct 2009 02:17:47 +0000 (22:17 -0400)]
g3dvl: Delete state_trackers/g3dvl, other unused files.
Younes Manton [Fri, 2 Oct 2009 02:16:10 +0000 (22:16 -0400)]
g3dvl: Copyright blocks.
Younes Manton [Fri, 2 Oct 2009 02:01:18 +0000 (22:01 -0400)]
st/xvmc: Set default CSC matrix to BT.601, no ProcAmp, full range RGB.
Younes Manton [Fri, 2 Oct 2009 01:53:17 +0000 (21:53 -0400)]
g3dvl: Color space conv interface & vl impl.
Interface is pipe_video_context::set_csc_matrix().
vl_csc.h defines some helpers to generate CSC matrices based on one of
the color standard and a user defined ProcAmp (brightness, contrast,
saturation, hue).
Eric Anholt [Wed, 29 Jul 2009 20:07:49 +0000 (13:07 -0700)]
i915: Add stub ARB_occlusion_query support under a driconf debug option.
This is useful for enabling our GLSL testcases using the 2.0 entrypoints
even though we don't have full GL 2.0.
Eric Anholt [Wed, 29 Jul 2009 20:00:09 +0000 (13:00 -0700)]
i915: Add optional support for ARB_fragment_shader under a driconf option.
Other vendors have enabled ARB_fragment_shader as part of OpenGL 2.0
enablement even on hardware like the 915 with no dynamic branching or
dFdx/dFdy support. But for now we'll leave it disabled because we don't
do any flattening of ifs or loops, which is rather restrictive.
This support is not complete, and may be unstable depending on your shaders.
It passes 10/15 of the piglit glsl tests, but hangs on glean glsl1.
Eric Anholt [Thu, 30 Jul 2009 03:44:39 +0000 (20:44 -0700)]
i915: Add support or fallbacks for GLSL fragment shader opcodes.
Eric Anholt [Thu, 1 Oct 2009 21:00:28 +0000 (14:00 -0700)]
i915: Add support for varying inputs.
Eric Anholt [Wed, 29 Jul 2009 19:15:14 +0000 (12:15 -0700)]
i915: Enable ARB_vertex_shader for both i915 and i830.
Since the TNL is all done in software anyway, it should be the same to
the user who's probably using ARB_vertex_program otherwise, but gives them
a nicer programming environment.
Eric Anholt [Thu, 30 Jul 2009 07:03:21 +0000 (00:03 -0700)]
i915: Increase maximum program size to the hardware limits.
This fixes potential heap trashing if the program of choice exceeds limits,
and fixes the native instructions limit being lower than what can be
used by valid programs.
Eric Anholt [Thu, 30 Jul 2009 06:37:04 +0000 (23:37 -0700)]
i915: Update and translate the fragment program along with state updates.
Previously, we were doing it in the midst of the pipeline run, which gave
an opportunity to enable/disable fallbacks, which is certainly the wrong
time to be doing so. This manifested itself in a NULL dereference for PutRow
after transitioning out of a fallback during a run_pipeline in glean glsl1.
Eric Anholt [Thu, 30 Jul 2009 05:46:14 +0000 (22:46 -0700)]
Revert "i915: don't validate PS program when falling back to software"
This reverts commit
e7044d552c6d16389447880b8744a51de1cf0199. It
prevented the driver from ever recovering from a software fallback due
to a program error. The original bug it claimed to fix doesn't appear to
exist post-revert.
Eric Anholt [Thu, 30 Jul 2009 05:39:15 +0000 (22:39 -0700)]
i915: Bail when the fragment program has too many total instructions.
Previously, we'd go trashing the heap.
Eric Anholt [Thu, 30 Jul 2009 19:32:40 +0000 (12:32 -0700)]
i915: Let i915_program_error take a format string, and don't use _mesa_problem.
It's misleading to report things like the program having too many native
instructions as a Mesa implementation error, when the program may just be
too big for the hardware.
Brian Paul [Thu, 1 Oct 2009 19:35:42 +0000 (13:35 -0600)]
Merge branch 'mesa_7_6_branch'
Vinson Lee [Thu, 1 Oct 2009 19:33:20 +0000 (13:33 -0600)]
mesa: Return -FLT_MAX instead of 0 for LG2(0).
lim x->0 log(x) = -inf so -FLT_MAX is a better approximation than 0
for LG2(0).
Brian Paul [Thu, 1 Oct 2009 19:14:16 +0000 (13:14 -0600)]
objviewer: remove disabled code
Brian Paul [Thu, 1 Oct 2009 19:13:28 +0000 (13:13 -0600)]
objviewer: mouse/keyboard info in README file
Brian Paul [Thu, 1 Oct 2009 19:11:38 +0000 (13:11 -0600)]
docs: added objviewer to release notes
Brian Paul [Thu, 1 Oct 2009 19:11:25 +0000 (13:11 -0600)]
mesa: add objviewer to PROGRAM_DIRS
Brian Paul [Thu, 1 Oct 2009 19:11:13 +0000 (13:11 -0600)]
mesa: add progs/objviewer to tarball list
Brian Paul [Thu, 1 Oct 2009 19:07:01 +0000 (13:07 -0600)]
objview: clean up drawing VBO code
Brian Paul [Thu, 1 Oct 2009 19:05:25 +0000 (13:05 -0600)]
objview: set skybox texture filter
Brian Paul [Thu, 1 Oct 2009 19:05:13 +0000 (13:05 -0600)]
objview: check GL version/extension
Brian Paul [Thu, 1 Oct 2009 18:58:36 +0000 (12:58 -0600)]
progs/objviewer: Wavefront .obj file loader/viewer demo
Adapted from code written by Nate Robins. See README.txt.
Michel Dänzer [Thu, 1 Oct 2009 14:45:11 +0000 (16:45 +0200)]
st/xorg: Check that ms->api->destroy is not NULL before calling it.
Fixes potential crash on X server shutdown.
Robert Noland [Wed, 30 Sep 2009 17:14:38 +0000 (10:14 -0700)]
util: Enable sockets on BSD
I think this should be safe for all of the BSDs.
Signed-off-by: Robert Noland <rnoland@2hip.net>
Signed-off-by: Brian Paul <brianp@vmware.com>
Robert Noland [Wed, 30 Sep 2009 16:36:18 +0000 (09:36 -0700)]
util: define PIPE_OS_FREEBSD to correct u_cpu_detect on FreeBSD.
Since the various BSDs use some different features here,
define PIPE_OS_OPENBSD and PIPE_OS_NETBSD as well
Signed-off-by: Robert Noland <rnoland@2hip.net>
Brian Paul [Wed, 30 Sep 2009 15:30:27 +0000 (09:30 -0600)]
mesa: better debug message
Keith Whitwell [Thu, 1 Oct 2009 13:34:23 +0000 (14:34 +0100)]
gallium: remove depth.occlusion_count flag
This was redundant as drivers can just keep track of whether they are
inside a begin/end query pair. We want to add more query types later
and also support nested queries, none of which map well onto a flag like
this. No driver appeared to be using the flag.
Cooper Yuan [Thu, 1 Oct 2009 09:54:27 +0000 (17:54 +0800)]
st/mesa: fix non-mipmap lastLevel calculation.
reviewed by Brian Paul.
Brian Paul [Tue, 29 Sep 2009 16:24:27 +0000 (10:24 -0600)]
glx: fix glXQueryContext(GLX_RENDER_TYPE)
The renderType parameter to CreateContext() was never used. Also, it
was often passed as zero. Now when it's zero we check if the context
is RGBA or CI mode and set it accordingly.
Fixes bug 24211.
Eric Anholt [Thu, 12 Feb 2009 11:54:58 +0000 (03:54 -0800)]
i965: Fix massive memory allocation for streaming texture usage.
Once we've freed a miptree, we won't see any more state cache requests
that would hit the things that pointed at it until we've let the miptree
get released back into the BO cache to be reused. By leaving those
surface state and binding table pointers that pointed at it around, we
would end up with up to (500 * texture size) in memory uselessly consumed
by the state cache.
Bug #20057
Bug #23530
Michel Dänzer [Wed, 30 Sep 2009 16:01:46 +0000 (18:01 +0200)]
st/xorg: Fix debug option function call typo.
Chia-I Wu [Sat, 12 Sep 2009 10:59:13 +0000 (18:59 +0800)]
mesa/main: New feature FEATURE_beginend.
This feature corresponds to the Begin/End paradigm. Disabling this
feature also eliminates the use of GLvertexformat completely.
Chia-I Wu [Wed, 9 Sep 2009 07:00:08 +0000 (15:00 +0800)]
mesa/main: Make FEATURE_dlist follow feature conventions.
As shown in mfeatures.h, this allows users of dlist.h to work without
knowing if the feature is available.
Chia-I Wu [Tue, 8 Sep 2009 02:25:22 +0000 (10:25 +0800)]
mesa/main: Make FEATURE_evaluators follow feature conventions.
As shown in mfeatures.h, this allows users of eval.h to work without
knowing if the feature is available.
Chia-I Wu [Tue, 8 Sep 2009 09:45:59 +0000 (17:45 +0800)]
mesa/main: New feature FEATURE_queryobj.
It merges FEATURE_ARB_occlusion_query and FEATURE_EXT_timer_query, and
follows the feature conventions.
Chia-I Wu [Tue, 8 Sep 2009 06:32:08 +0000 (14:32 +0800)]
mesa/main: New feature FEATURE_arrayelt.
This allows the removal of AEcontext.
Chia-I Wu [Tue, 8 Sep 2009 03:01:19 +0000 (11:01 +0800)]
mesa/main: Make FEATURE_texgen follow feature conventions.
As shown in mfeatures.h, this allows users of texgen.h to work without
knowing if the feature is available.
Chia-I Wu [Tue, 8 Sep 2009 02:52:01 +0000 (10:52 +0800)]
mesa/main: Make FEATURE_feedback follow feature conventions.
As shown in mfeatures.h, this allows users of feedback.h to work without
knowing if the feature is available.
Chia-I Wu [Tue, 8 Sep 2009 02:15:06 +0000 (10:15 +0800)]
mesa/main: Make FEATURE_drawpix follow feature conventions.
As shown in mfeatures.h, this allows users of drawpix.h to work
without knowing if the feature is available.
Chia-I Wu [Tue, 8 Sep 2009 02:05:36 +0000 (10:05 +0800)]
mesa/main: New feature FEATURE_rastpos.
It is separated from FEATURE_drawpix and made to follow the feature
conventions.
Chia-I Wu [Mon, 7 Sep 2009 10:06:00 +0000 (18:06 +0800)]
mesa/main: Make FEATURE_histogram follow feature conventions.
As shown in mfeatures.h, this allows users of histogram.h to work without
knowing if the feature is available.
Chia-I Wu [Mon, 7 Sep 2009 10:20:10 +0000 (18:20 +0800)]
mesa/main: Make FEATURE_attrib_stack follow feature conventions.
As shown in mfeatures.h, this allows users of attrib.h to work without
knowing if the feature is available.
Chia-I Wu [Mon, 7 Sep 2009 09:51:42 +0000 (17:51 +0800)]
mesa/main: Make FEATURE_accum follow feature conventions.
As shown in mfeatures.h, this allows users of accum.h to work without
knowing if the feature is available.
Chia-I Wu [Wed, 30 Sep 2009 04:32:22 +0000 (12:32 +0800)]
progs/egl: Make demo3 work again.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Chia-I Wu [Wed, 30 Sep 2009 04:13:34 +0000 (12:13 +0800)]
progs/egl: Check EGL_MESA_screen_surface is supported in demo2.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Chia-I Wu [Wed, 30 Sep 2009 04:28:01 +0000 (12:28 +0800)]
progs/egl: Fix a crash in demo1.
The variable "configs" in main() is used without initialization.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Chia-I Wu [Wed, 30 Sep 2009 03:36:01 +0000 (11:36 +0800)]
st/egl: Fix a double free in drm_destroy_context.
st_destroy_context has destroyed the pipe context for us.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Chia-I Wu [Wed, 30 Sep 2009 03:32:36 +0000 (11:32 +0800)]
st/egl: Fix a crash when unbinding current context.
This fixes a NULL-pointer dereference when
eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)
is called.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Chia-I Wu [Wed, 30 Sep 2009 03:13:16 +0000 (11:13 +0800)]
progs/egl: Replace EGL_i915 by EGL_DEFAULT_DISPLAY.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Brian Paul [Wed, 30 Sep 2009 01:05:04 +0000 (19:05 -0600)]
docs: document GLSL sqrt(0) fix
Brian Paul [Wed, 30 Sep 2009 00:59:37 +0000 (18:59 -0600)]
glsl: regenerated file
Brian Paul [Wed, 30 Sep 2009 00:57:13 +0000 (18:57 -0600)]
glsl: rewrite sqrt(x) intrinsic to handle x=0
Since sqrt() is basically implemented in terms of RSQ/RCP we'll do a
divide by zero if x=0 and wind up with unpredictable results.
Now use CMP instruction to test for x<=0 and return zero in that case.
Brian Paul [Wed, 30 Sep 2009 00:51:49 +0000 (18:51 -0600)]
glsl: add support for CMP instruction
Brian Paul [Tue, 29 Sep 2009 18:18:41 +0000 (12:18 -0600)]
docs: fixed glXQueryContext(GLX_RENDER_TYPE)
Brian Paul [Tue, 29 Sep 2009 18:17:11 +0000 (12:17 -0600)]
gallium/xlib: fix GLX_RENDER_TYPE query
Return GLX_RGBA_TYPE or GLX_COLOR_INDEX_TYPE.
Brian Paul [Tue, 29 Sep 2009 18:16:12 +0000 (12:16 -0600)]
mesa/xlib: fix GLX_RENDER_TYPE query
Return GLX_RGBA_TYPE or GLX_COLOR_INDEX_TYPE.
Brian Paul [Tue, 29 Sep 2009 16:22:32 +0000 (10:22 -0600)]
mesa: added nopfrag/nopvert options for MESA_GLSL
These options can be used to force vertex/fragment shaders to be no-op
shaders (actually, simple pass-through shaders). For debug/test purposes.
Brian Paul [Mon, 28 Sep 2009 21:26:12 +0000 (15:26 -0600)]
mesa: added _mesa_nop_vertex/fragment_program()
For debug/test purposes.
José Fonseca [Tue, 29 Sep 2009 16:26:20 +0000 (17:26 +0100)]
llvmpipe: Workaround for bug in llvm 2.5.
The combination of fptosi
and sitofp (necessary for trunc/floor/ceil/round implementation)
somehow becomes invalid code.
Skip the instruction combining pass when SSE4.1 is not available.
José Fonseca [Tue, 29 Sep 2009 16:22:39 +0000 (17:22 +0100)]
llvmpipe: First verify LLVM IR, only then run optimizing passes.
José Fonseca [Tue, 29 Sep 2009 16:21:34 +0000 (17:21 +0100)]
llvmpipe: Runtime cpu checks for lp_build_min_simple too.
José Fonseca [Tue, 29 Sep 2009 15:59:13 +0000 (16:59 +0100)]
llvmpipe: Implement non SSE4.1 versions of floor and round.
Brian Paul [Tue, 29 Sep 2009 15:58:47 +0000 (09:58 -0600)]
glx: indentation fixes
Brian Paul [Tue, 29 Sep 2009 15:46:49 +0000 (09:46 -0600)]
Merge branch 'mesa_7_6_branch'
Conflicts:
Makefile
configs/default
docs/relnotes.html
src/gallium/drivers/softpipe/sp_context.c
src/gallium/drivers/softpipe/sp_tile_cache.c
src/mesa/main/version.h
Brian Paul [Tue, 29 Sep 2009 15:36:06 +0000 (09:36 -0600)]
mesa: bump version to 7.6.1
Brian Paul [Tue, 29 Sep 2009 15:34:47 +0000 (09:34 -0600)]
docs: initial 7.6.1 release notes
Brian Paul [Tue, 29 Sep 2009 15:32:37 +0000 (09:32 -0600)]
mesa: work-around glXCopyContext() bug in _mesa_copy_texture_state()
See bug 24217.
Brian Paul [Tue, 29 Sep 2009 14:50:56 +0000 (08:50 -0600)]
softpipe: initialize the clear_flags bitvector in sp_create_tile_cache()
This silences tons of valgrind warnings in programs that don't call
glClear(), such as progs/demos/gamma.
Brian Paul [Tue, 29 Sep 2009 14:21:54 +0000 (08:21 -0600)]
softpipe: Grab a ref when the fb is set.
Nasty bug when the surface is freed and another is allocated right on
top of it. The next time we set the fb state SP thinks it's the same
surface and doesn't flush, and when the flush eventually happens the
surface belongs to a completely different texture.
(cherry picked from commit
a77226071f6814a53358a5d6caff685889d0e4ec)
Conflicts:
src/gallium/drivers/softpipe/sp_context.c
Chia-I Wu [Sun, 27 Sep 2009 08:40:43 +0000 (16:40 +0800)]
egl_xdri: Report full list of supported configs.
Call _eglConfigFromContextModesRec to convert __GLcontextModes to
_EGLConfig. Single-buffered configs are no longer skipped.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Chia-I Wu [Sun, 27 Sep 2009 09:00:51 +0000 (17:00 +0800)]
egl: Add support for querying render buffer.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Chia-I Wu [Sun, 27 Sep 2009 08:14:36 +0000 (16:14 +0800)]
egl: Add a function to convert __GLcontextModes to _EGLConfig.
_eglConfigFromContextModesRec is used to convert a __GLcontextModes to a
_EGLConfig. Note that the config is not validated. An invalid mode
is likely to give an invalid config.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>