On Sun, Apr 26, 2015 at 12:27 PM, Axel Davy <axel.d...@ens.fr> wrote: > From: Tiziano Bacocco <tizb...@gmail.com> > > As on wined3d and windows, when D3DCREATE_FPU_PRESERVE is not > specified, change the fpu control word to all exceptions masked, > single precision, round to nearest. > > Signed-off-by: Axel Davy <axel.d...@ens.fr> > Signed-off-by: Tiziano Bacocco <tizb...@gmail.com> > --- > src/gallium/state_trackers/nine/device9.c | 31 > +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/src/gallium/state_trackers/nine/device9.c > b/src/gallium/state_trackers/nine/device9.c > index 1a776a7..0bd1717 100644 > --- a/src/gallium/state_trackers/nine/device9.c > +++ b/src/gallium/state_trackers/nine/device9.c > @@ -41,6 +41,7 @@ > > #include "pipe/p_screen.h" > #include "pipe/p_context.h" > +#include "pipe/p_config.h" > #include "util/u_math.h" > #include "util/u_inlines.h" > #include "util/u_hash_table.h" > @@ -53,6 +54,33 @@ > > #define DBG_CHANNEL DBG_DEVICE > > +#if defined(PIPE_CC_GCC) && (defined(PIPE_ARCH_X86) || > defined(PIPE_ARCH_X86_64)) > + > +#include <fpu_control.h> > + > +static void nine_setup_fpu() > +{ > + fpu_control_t c; > + > + _FPU_GETCW(c); > + /* clear the control word */ > + c &= _FPU_RESERVED; > + /* d3d9 doc/wine tests: mask all exceptions, use single-precision > + * and round to nearest */ > + c |= _FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM | > + _FPU_MASK_UM | _FPU_MASK_PM | _FPU_SINGLE | _FPU_RC_NEAREST; > + _FPU_SETCW(c);
Again... why not use the fe* functions which are in C99 and you don't have to do these checks? fenv_t env; feholdexcept(&env); fesetenv(&env); fesetround(FE_TONEAREST); Hmmm... not sure about the _FPU_SINGLE thing -- what does that do? > +} > + > +#else > + > +static void nine_setup_fpu(void) > +{ > + WARN_ONCE("FPU setup not supported on non-x86 platforms\n"); > +} > + > +#endif > + > static void > NineDevice9_SetDefaultState( struct NineDevice9 *This, boolean is_reset ) > { > @@ -168,6 +196,9 @@ NineDevice9_ctor( struct NineDevice9 *This, > IDirect3D9_AddRef(This->d3d9); > ID3DPresentGroup_AddRef(This->present); > > + if (!(This->params.BehaviorFlags & D3DCREATE_FPU_PRESERVE)) > + nine_setup_fpu(); > + > This->pipe = This->screen->context_create(This->screen, NULL); > if (!This->pipe) { return E_OUTOFMEMORY; } /* guess */ > > -- > 2.1.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev