diff --git a/configure b/configure index 152cb8fd651..c66817ecfd0 100755 --- a/configure +++ b/configure @@ -2889,6 +2889,12 @@ fi done + +X_SRCS="" + +DGA_SRCS="" + +MESA_SRCS="" if test "$have_x" = "yes" then XLIB="-lXext -lX11" @@ -2899,17 +2905,17 @@ then do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2903: checking for $ac_hdr" >&5 +echo "configure:2909: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2913: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2919: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2938,7 +2944,7 @@ done if test "$ac_cv_header_X11_xpm_h" = "yes" then echo $ac_n "checking for XpmCreatePixmapFromData in -lXpm""... $ac_c" 1>&6 -echo "configure:2942: checking for XpmCreatePixmapFromData in -lXpm" >&5 +echo "configure:2948: checking for XpmCreatePixmapFromData in -lXpm" >&5 ac_lib_var=`echo Xpm'_'XpmCreatePixmapFromData | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2946,7 +2952,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXpm $X_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2967: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3000,17 +3006,17 @@ fi do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3004: checking for $ac_hdr" >&5 +echo "configure:3010: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3014: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3020: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3039,7 +3045,7 @@ done if test "$ac_cv_header_X11_Xlib_h" = "yes" -a "$ac_cv_header_X11_extensions_XShm_h" = "yes" then echo $ac_n "checking for XShmQueryExtension in -lXext""... $ac_c" 1>&6 -echo "configure:3043: checking for XShmQueryExtension in -lXext" >&5 +echo "configure:3049: checking for XShmQueryExtension in -lXext" >&5 ac_lib_var=`echo Xext'_'XShmQueryExtension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3047,7 +3053,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXext $X_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3086,17 +3092,17 @@ fi do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3090: checking for $ac_hdr" >&5 +echo "configure:3096: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3100: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3106: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3125,15 +3131,16 @@ done if test "$ac_cv_header_X11_Xlib_h" = "yes" -a "$ac_cv_header_X11_extensions_xf86dga_h" = "yes" then echo $ac_n "checking for XDGAQueryExtension in -lXxf86dga""... $ac_c" 1>&6 -echo "configure:3129: checking for XDGAQueryExtension in -lXxf86dga" >&5 +echo "configure:3135: checking for XDGAQueryExtension in -lXxf86dga" >&5 ac_lib_var=`echo Xxf86dga'_'XDGAQueryExtension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" -LIBS="-lXxf86dga $X_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBS" +LIBS="-lXxf86dga $X_LIBS -lXext -lX11 $X_EXTRA_LIBS + $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3155: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3162,10 +3169,14 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then cat >> confdefs.h <<\EOF #define HAVE_LIBXXF86DGA2 1 EOF - cat >> confdefs.h <<\EOF + + cat >> confdefs.h <<\EOF #define HAVE_LIBXXF86DGA 1 EOF - X_PRE_LIBS="$X_PRE_LIBS -lXxf86dga" + + X_PRE_LIBS="$X_PRE_LIBS -lXxf86dga" + DGA_SRCS='$(DGA_SRCS)' + else echo "$ac_t""no" 1>&6 fi @@ -3173,7 +3184,7 @@ fi if test "$ac_cv_lib_Xxf86dga_XDGAQueryExtension" = "no" then echo $ac_n "checking for XF86DGAQueryExtension in -lXxf86dga""... $ac_c" 1>&6 -echo "configure:3177: checking for XF86DGAQueryExtension in -lXxf86dga" >&5 +echo "configure:3188: checking for XF86DGAQueryExtension in -lXxf86dga" >&5 ac_lib_var=`echo Xxf86dga'_'XF86DGAQueryExtension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3181,7 +3192,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXxf86dga $X_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3210,7 +3221,10 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then cat >> confdefs.h <<\EOF #define HAVE_LIBXXF86DGA 1 EOF - X_PRE_LIBS="$X_PRE_LIBS -lXxf86dga" + + X_PRE_LIBS="$X_PRE_LIBS -lXxf86dga" + DGA_SRCS='$(DGA_SRCS)' + else echo "$ac_t""no" 1>&6 fi @@ -3222,17 +3236,17 @@ fi do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3226: checking for $ac_hdr" >&5 +echo "configure:3240: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3236: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3250: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3261,7 +3275,7 @@ done if test "$ac_cv_header_X11_Xlib_h" = "yes" -a "$ac_cv_header_X11_extensions_xf86vmode_h" = "yes" then echo $ac_n "checking for XF86VidModeQueryExtension in -lXxf86vm""... $ac_c" 1>&6 -echo "configure:3265: checking for XF86VidModeQueryExtension in -lXxf86vm" >&5 +echo "configure:3279: checking for XF86VidModeQueryExtension in -lXxf86vm" >&5 ac_lib_var=`echo Xxf86vm'_'XF86VidModeQueryExtension | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3269,7 +3283,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lXxf86vm $X_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3298: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3309,17 +3323,17 @@ fi do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3313: checking for $ac_hdr" >&5 +echo "configure:3327: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3323: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3337: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3348,19 +3362,19 @@ done if test "$ac_cv_header_GL_gl_h" = "yes" -a "$ac_cv_header_GL_glx_h" = "yes" then echo $ac_n "checking "for up-to-date Mesa version"""... $ac_c" 1>&6 -echo "configure:3352: checking "for up-to-date Mesa version"" >&5 +echo "configure:3366: checking "for up-to-date Mesa version"" >&5 if eval "test \"`echo '$''{'wine_cv_mesa_version_OK'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { GLenum test = GL_UNSIGNED_SHORT_5_6_5; ; return 0; } EOF -if { (eval echo configure:3364: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3378: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_mesa_version_OK="yes" else @@ -3377,21 +3391,21 @@ fi echo "$ac_t""$wine_cv_mesa_version_OK" 1>&6 echo $ac_n "checking "for thread-safe Mesa version"""... $ac_c" 1>&6 -echo "configure:3381: checking "for thread-safe Mesa version"" >&5 +echo "configure:3395: checking "for thread-safe Mesa version"" >&5 if eval "test \"`echo '$''{'wine_cv_mesa_version_threadsafe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_libs=$LIBS LIBS="$X_LIBS -lGL" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* wine_cv_mesa_version_threadsafe="yes" else @@ -3410,7 +3424,7 @@ echo "$ac_t""$wine_cv_mesa_version_threadsafe" 1>&6 if test "$wine_cv_mesa_version_OK" = "yes" -a "$wine_cv_mesa_version_threadsafe" = "no" then echo $ac_n "checking for glXCreateContext in -lGL""... $ac_c" 1>&6 -echo "configure:3414: checking for glXCreateContext in -lGL" >&5 +echo "configure:3428: checking for glXCreateContext in -lGL" >&5 ac_lib_var=`echo GL'_'glXCreateContext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3418,7 +3432,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lGL $X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3447: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3447,7 +3461,10 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then cat >> confdefs.h <<\EOF #define HAVE_LIBMESAGL 1 EOF - X_PRE_LIBS="$X_PRE_LIBS -lGL" + + X_PRE_LIBS="$X_PRE_LIBS -lGL" + MESA_SRCS='$(MESA_SRCS)' + else echo "$ac_t""no" 1>&6 fi @@ -3455,7 +3472,7 @@ fi if test "$ac_cv_lib_GL_glXCreateContext" = "no" then echo $ac_n "checking for glXCreateContext in -lMesaGL""... $ac_c" 1>&6 -echo "configure:3459: checking for glXCreateContext in -lMesaGL" >&5 +echo "configure:3476: checking for glXCreateContext in -lMesaGL" >&5 ac_lib_var=`echo MesaGL'_'glXCreateContext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3463,7 +3480,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lMesaGL $X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3492,7 +3509,10 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then cat >> confdefs.h <<\EOF #define HAVE_LIBMESAGL 1 EOF - X_PRE_LIBS="$X_PRE_LIBS -lMesaGL" + + X_PRE_LIBS="$X_PRE_LIBS -lMesaGL" + MESA_SRCS='$(MESA_SRCS)' + else echo "$ac_t""no" 1>&6 fi @@ -3500,19 +3520,19 @@ fi fi echo $ac_n "checking "for the OpenGL Color Index extension"""... $ac_c" 1>&6 -echo "configure:3504: checking "for the OpenGL Color Index extension"" >&5 +echo "configure:3524: checking "for the OpenGL Color Index extension"" >&5 if eval "test \"`echo '$''{'dummy'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { GLenum test = GL_COLOR_INDEX8_EXT; ; return 0; } EOF -if { (eval echo configure:3516: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3536: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_GL_COLOR_TABLE 1 @@ -3530,7 +3550,7 @@ echo "$ac_t""$dummy" 1>&6 if test "$ac_cv_lib_GL_glXCreateContext" = "no" then echo $ac_n "checking for glColorTableEXT in -lMesaGL""... $ac_c" 1>&6 -echo "configure:3534: checking for glColorTableEXT in -lMesaGL" >&5 +echo "configure:3554: checking for glColorTableEXT in -lMesaGL" >&5 ac_lib_var=`echo MesaGL'_'glColorTableEXT | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3538,7 +3558,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lMesaGL $X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3573: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3574,7 +3594,7 @@ fi else echo $ac_n "checking for glColorTableEXT in -lGL""... $ac_c" 1>&6 -echo "configure:3578: checking for glColorTableEXT in -lGL" >&5 +echo "configure:3598: checking for glColorTableEXT in -lGL" >&5 ac_lib_var=`echo GL'_'glColorTableEXT | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3582,7 +3602,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lGL $X_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3621,6 +3641,7 @@ fi fi CPPFLAGS="$ac_save_CPPFLAGS" + X_SRCS='$(X_SRCS)' else XLIB="" X_CFLAGS="" @@ -3631,17 +3652,17 @@ for ac_hdr in ncurses.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3635: checking for $ac_hdr" >&5 +echo "configure:3656: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3645: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3666: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3670,7 +3691,7 @@ done if test "$ac_cv_header_ncurses_h" = "yes" then echo $ac_n "checking for waddch in -lncurses""... $ac_c" 1>&6 -echo "configure:3674: checking for waddch in -lncurses" >&5 +echo "configure:3695: checking for waddch in -lncurses" >&5 ac_lib_var=`echo ncurses'_'waddch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3678,7 +3699,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3720,7 +3741,7 @@ fi if test "$ac_cv_lib_ncurses_waddch" = "yes" then echo $ac_n "checking for resizeterm in -lncurses""... $ac_c" 1>&6 -echo "configure:3724: checking for resizeterm in -lncurses" >&5 +echo "configure:3745: checking for resizeterm in -lncurses" >&5 ac_lib_var=`echo ncurses'_'resizeterm | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3728,7 +3749,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3764: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3763,7 +3784,7 @@ else fi echo $ac_n "checking for getbkgd in -lncurses""... $ac_c" 1>&6 -echo "configure:3767: checking for getbkgd in -lncurses" >&5 +echo "configure:3788: checking for getbkgd in -lncurses" >&5 ac_lib_var=`echo ncurses'_'getbkgd | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3771,7 +3792,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3807: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3810,17 +3831,17 @@ else do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3814: checking for $ac_hdr" >&5 +echo "configure:3835: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3824: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3845: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3849,7 +3870,7 @@ done if test "$ac_cv_header_curses_h" = "yes" then echo $ac_n "checking for waddch in -lcurses""... $ac_c" 1>&6 -echo "configure:3853: checking for waddch in -lcurses" >&5 +echo "configure:3874: checking for waddch in -lcurses" >&5 ac_lib_var=`echo curses'_'waddch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3857,7 +3878,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3893: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3896,7 +3917,7 @@ else fi echo $ac_n "checking for resizeterm in -lcurses""... $ac_c" 1>&6 -echo "configure:3900: checking for resizeterm in -lcurses" >&5 +echo "configure:3921: checking for resizeterm in -lcurses" >&5 ac_lib_var=`echo curses'_'resizeterm | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3904,7 +3925,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3939,7 +3960,7 @@ else fi echo $ac_n "checking for getbkgd in -lcurses""... $ac_c" 1>&6 -echo "configure:3943: checking for getbkgd in -lcurses" >&5 +echo "configure:3964: checking for getbkgd in -lcurses" >&5 ac_lib_var=`echo curses'_'getbkgd | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3947,7 +3968,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3985,12 +4006,12 @@ fi fi echo $ac_n "checking "for GNU style IPX support"""... $ac_c" 1>&6 -echo "configure:3989: checking "for GNU style IPX support"" >&5 +echo "configure:4010: checking "for GNU style IPX support"" >&5 if eval "test \"`echo '$''{'ac_cv_c_ipx_gnu'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -3998,7 +4019,7 @@ int main() { ((struct sockaddr_ipx *)0)->sipx_family == AF_IPX ; return 0; } EOF -if { (eval echo configure:4002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4023: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_ipx_gnu="yes" else @@ -4023,12 +4044,12 @@ fi if test "$ac_cv_c_ipx_gnu" = "no" then echo $ac_n "checking "for linux style IPX support"""... $ac_c" 1>&6 -echo "configure:4027: checking "for linux style IPX support"" >&5 +echo "configure:4048: checking "for linux style IPX support"" >&5 if eval "test \"`echo '$''{'ac_cv_c_ipx_linux'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -4037,7 +4058,7 @@ int main() { ((struct sockaddr_ipx *)0)->sipx_family == AF_IPX ; return 0; } EOF -if { (eval echo configure:4041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4062: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_ipx_linux="yes" else @@ -4064,17 +4085,17 @@ for ac_hdr in sys/soundcard.h machine/soundcard.h soundcard.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:4068: checking for $ac_hdr" >&5 +echo "configure:4089: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4078: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:4099: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -4102,12 +4123,12 @@ done echo $ac_n "checking "for Open Sound System"""... $ac_c" 1>&6 -echo "configure:4106: checking "for Open Sound System"" >&5 +echo "configure:4127: checking "for Open Sound System"" >&5 if eval "test \"`echo '$''{'ac_cv_c_opensoundsystem'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4153: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_opensoundsystem="yes" else @@ -4151,12 +4172,12 @@ EOF fi echo $ac_n "checking "for Open Sound System/MIDI interface"""... $ac_c" 1>&6 -echo "configure:4155: checking "for Open Sound System/MIDI interface"" >&5 +echo "configure:4176: checking "for Open Sound System/MIDI interface"" >&5 if eval "test \"`echo '$''{'ac_cv_c_opensoundsystem_midi'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4202: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_opensoundsystem_midi="yes" else @@ -4206,7 +4227,7 @@ if test "x${GCC}" = "xyes" then CFLAGS="$CFLAGS -Wall" echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6 -echo "configure:4210: checking "for gcc strength-reduce bug"" >&5 +echo "configure:4231: checking "for gcc strength-reduce bug"" >&5 if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4214,7 +4235,7 @@ else ac_cv_c_gcc_strength_bug="yes" else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4250: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_gcc_strength_bug="no" else @@ -4248,7 +4269,7 @@ fi echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6 -echo "configure:4252: checking "whether external symbols need an underscore prefix"" >&5 +echo "configure:4273: checking "whether external symbols need an underscore prefix"" >&5 if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4260,14 +4281,14 @@ _ac_test: .long 0 EOF cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_c_extern_prefix="yes" else @@ -4291,7 +4312,7 @@ fi echo $ac_n "checking "whether assembler accepts .string"""... $ac_c" 1>&6 -echo "configure:4295: checking "whether assembler accepts .string"" >&5 +echo "configure:4316: checking "whether assembler accepts .string"" >&5 if eval "test \"`echo '$''{'ac_cv_c_asm_string'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4301,14 +4322,14 @@ cat > conftest_asm.s < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4333: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_c_asm_string="yes" else @@ -4335,21 +4356,21 @@ LDSHARED="" if test "$LIBEXT" = "so" then echo $ac_n "checking "whether we can build a Linux dll"""... $ac_c" 1>&6 -echo "configure:4339: checking "whether we can build a Linux dll"" >&5 +echo "configure:4360: checking "whether we can build a Linux dll"" >&5 if eval "test \"`echo '$''{'ac_cv_c_dll_linux'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_cflags=$CFLAGS CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4374: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_c_dll_linux="yes" else @@ -4369,21 +4390,21 @@ echo "$ac_t""$ac_cv_c_dll_linux" 1>&6 LDSHARED="\$(CC) -shared -Wl,-soname,\$(SONAME),-rpath,\$(libdir)" else echo $ac_n "checking whether we can build a UnixWare (Solaris) dll""... $ac_c" 1>&6 -echo "configure:4373: checking whether we can build a UnixWare (Solaris) dll" >&5 +echo "configure:4394: checking whether we can build a UnixWare (Solaris) dll" >&5 if eval "test \"`echo '$''{'ac_cv_c_dll_unixware'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_cflags=$CFLAGS CFLAGS="$CFLAGS -fPIC -Wl,-G,-h,conftest.so.1.0" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_c_dll_unixware="yes" else @@ -4403,21 +4424,21 @@ echo "$ac_t""$ac_cv_c_dll_unixware" 1>&6 LDSHARED="\$(CC) -Wl,-G,-h,\$(libdir)/\$(SONAME)" else echo $ac_n "checking "whether we can build a NetBSD dll"""... $ac_c" 1>&6 -echo "configure:4407: checking "whether we can build a NetBSD dll"" >&5 +echo "configure:4428: checking "whether we can build a NetBSD dll"" >&5 if eval "test \"`echo '$''{'ac_cv_c_dll_netbsd'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_cflags=$CFLAGS CFLAGS="$CFLAGS -fPIC -Bshareable -Bforcearchive" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4442: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_c_dll_netbsd="yes" else @@ -4453,21 +4474,21 @@ if test "$LIBEXT" = "so"; then DLLFLAGS="-fPIC" else echo $ac_n "checking whether the linker supports --[no]-whole-archive (Linux)""... $ac_c" 1>&6 -echo "configure:4457: checking whether the linker supports --[no]-whole-archive (Linux)" >&5 +echo "configure:4478: checking whether the linker supports --[no]-whole-archive (Linux)" >&5 if eval "test \"`echo '$''{'ac_cv_c_whole_archive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_cflags=$CFLAGS CFLAGS="$CFLAGS -Wl,--whole-archive -Wl,--no-whole-archive" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_c_whole_archive="yes" else @@ -4487,21 +4508,21 @@ echo "$ac_t""$ac_cv_c_whole_archive" 1>&6 DLL_LINK="-Wl,--whole-archive $DLL_LINK -Wl,--no-whole-archive" else echo $ac_n "checking whether the linker supports -z {all,default}extract (Linux)""... $ac_c" 1>&6 -echo "configure:4491: checking whether the linker supports -z {all,default}extract (Linux)" >&5 +echo "configure:4512: checking whether the linker supports -z {all,default}extract (Linux)" >&5 if eval "test \"`echo '$''{'ac_cv_c_allextract'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_cflags=$CFLAGS CFLAGS="$CFLAGS -Wl,-z,allextract -Wl,-z,defaultextract" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4526: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_c_allextract="yes" else @@ -4532,7 +4553,7 @@ fi wine_cv_libc_reentrant=no echo $ac_n "checking "for reentrant libc: __errno_location"""... $ac_c" 1>&6 -echo "configure:4536: checking "for reentrant libc: __errno_location"" >&5 +echo "configure:4557: checking "for reentrant libc: __errno_location"" >&5 if eval "test \"`echo '$''{'wine_cv_libc_r__errno_location'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4540,14 +4561,14 @@ else wine_cv_libc_r__errno_location=yes else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4572: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then wine_cv_libc_r__errno_location=yes else @@ -4572,7 +4593,7 @@ EOF wine_cv_libc_reentrant=__errno_location fi echo $ac_n "checking "for reentrant libc: __error"""... $ac_c" 1>&6 -echo "configure:4576: checking "for reentrant libc: __error"" >&5 +echo "configure:4597: checking "for reentrant libc: __error"" >&5 if eval "test \"`echo '$''{'wine_cv_libc_r__error'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4580,14 +4601,14 @@ else wine_cv_libc_r__error=yes else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4612: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then wine_cv_libc_r__error=yes else @@ -4612,7 +4633,7 @@ EOF wine_cv_libc_reentrant=__error fi echo $ac_n "checking "for reentrant libc: ___errno"""... $ac_c" 1>&6 -echo "configure:4616: checking "for reentrant libc: ___errno"" >&5 +echo "configure:4637: checking "for reentrant libc: ___errno"" >&5 if eval "test \"`echo '$''{'wine_cv_libc_r___errno'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4620,14 +4641,14 @@ else wine_cv_libc_r___errno=yes else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then wine_cv_libc_r___errno=yes else @@ -4652,7 +4673,7 @@ EOF wine_cv_libc_reentrant=___errno fi echo $ac_n "checking "for reentrant libc: __thr_errno"""... $ac_c" 1>&6 -echo "configure:4656: checking "for reentrant libc: __thr_errno"" >&5 +echo "configure:4677: checking "for reentrant libc: __thr_errno"" >&5 if eval "test \"`echo '$''{'wine_cv_libc_r__thr_errno'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4660,14 +4681,14 @@ else wine_cv_libc_r__thr_errno=yes else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4692: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then wine_cv_libc_r__thr_errno=yes else @@ -4703,7 +4724,7 @@ fi if test "$have_x" = "yes" -a "$wine_cv_libc_reentrant" != "no" then echo $ac_n "checking "for reentrant X libraries"""... $ac_c" 1>&6 -echo "configure:4707: checking "for reentrant X libraries"" >&5 +echo "configure:4728: checking "for reentrant X libraries"" >&5 if eval "test \"`echo '$''{'wine_cv_x_reentrant'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -4749,14 +4770,14 @@ fi echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -echo "configure:4753: checking whether byte ordering is bigendian" >&5 +echo "configure:4774: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext < #include @@ -4767,11 +4788,11 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:4771: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4792: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext < #include @@ -4782,7 +4803,7 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:4786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:4807: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else @@ -4802,7 +4823,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:4840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else @@ -4843,19 +4864,19 @@ fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:4847: checking for working alloca.h" >&5 +echo "configure:4868: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { void *p = alloca(2 * sizeof(int)); ; return 0; } EOF -if { (eval echo configure:4859: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4880: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else @@ -4876,12 +4897,12 @@ EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:4880: checking for alloca" >&5 +echo "configure:4901: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:4934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else @@ -4941,12 +4962,12 @@ EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:4945: checking whether alloca needs Cray hooks" >&5 +echo "configure:4966: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4975: checking for $ac_func" >&5 +echo "configure:4996: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -5026,7 +5047,7 @@ done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:5030: checking stack direction for C alloca" >&5 +echo "configure:5051: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5034,7 +5055,7 @@ else ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:5078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else @@ -5104,12 +5125,12 @@ for ac_func in \ do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:5108: checking for $ac_func" >&5 +echo "configure:5129: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -5211,17 +5232,17 @@ for ac_hdr in \ do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:5215: checking for $ac_hdr" >&5 +echo "configure:5236: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:5225: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -5248,12 +5269,12 @@ fi done echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6 -echo "configure:5252: checking whether stat file-mode macros are broken" >&5 +echo "configure:5273: checking whether stat file-mode macros are broken" >&5 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -5306,12 +5327,12 @@ fi echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:5310: checking for working const" >&5 +echo "configure:5331: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5385: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -5381,21 +5402,21 @@ EOF fi echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:5385: checking for inline" >&5 +echo "configure:5406: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5420: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else @@ -5421,12 +5442,12 @@ EOF esac echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:5425: checking for ANSI C header files" >&5 +echo "configure:5446: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -5434,7 +5455,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:5438: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5459: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -5451,7 +5472,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -5469,7 +5490,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -5490,7 +5511,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -5501,7 +5522,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:5505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:5526: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -5525,12 +5546,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:5529: checking for size_t" >&5 +echo "configure:5550: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -5558,7 +5579,7 @@ EOF fi echo $ac_n "checking size of long long""... $ac_c" 1>&6 -echo "configure:5562: checking size of long long" >&5 +echo "configure:5583: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5566,7 +5587,7 @@ else ac_cv_sizeof_long_long=0 else cat > conftest.$ac_ext < main() @@ -5577,7 +5598,7 @@ main() exit(0); } EOF -if { (eval echo configure:5581: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:5602: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long=`cat conftestval` else @@ -5600,12 +5621,12 @@ EOF if test "$ac_cv_header_linux_joystick_h" = "yes" then echo $ac_n "checking "whether linux/joystick.h uses the Linux 2.2+ API"""... $ac_c" 1>&6 -echo "configure:5604: checking "whether linux/joystick.h uses the Linux 2.2+ API"" >&5 +echo "configure:5625: checking "whether linux/joystick.h uses the Linux 2.2+ API"" >&5 if eval "test \"`echo '$''{'wine_cv_linux_joystick_22_api'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -5620,7 +5641,7 @@ int main() { /*empty*/ ; return 0; } EOF -if { (eval echo configure:5624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5645: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_linux_joystick_22_api=yes else @@ -5647,12 +5668,12 @@ fi if test "$ac_cv_header_sys_vfs_h" = "yes" then echo $ac_n "checking "whether sys/vfs.h defines statfs"""... $ac_c" 1>&6 -echo "configure:5651: checking "whether sys/vfs.h defines statfs"" >&5 +echo "configure:5672: checking "whether sys/vfs.h defines statfs"" >&5 if eval "test \"`echo '$''{'wine_cv_sys_vfs_has_statfs'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -5669,7 +5690,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:5673: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5694: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_sys_vfs_has_statfs=yes else @@ -5696,12 +5717,12 @@ fi if test "$ac_cv_header_sys_statfs_h" = "yes" then echo $ac_n "checking "whether sys/statfs.h defines statfs"""... $ac_c" 1>&6 -echo "configure:5700: checking "whether sys/statfs.h defines statfs"" >&5 +echo "configure:5721: checking "whether sys/statfs.h defines statfs"" >&5 if eval "test \"`echo '$''{'wine_cv_sys_statfs_has_statfs'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -5716,7 +5737,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:5720: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5741: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_sys_statfs_has_statfs=yes else @@ -5743,12 +5764,12 @@ fi if test "$ac_cv_header_sys_mount_h" = "yes" then echo $ac_n "checking "whether sys/mount.h defines statfs"""... $ac_c" 1>&6 -echo "configure:5747: checking "whether sys/mount.h defines statfs"" >&5 +echo "configure:5768: checking "whether sys/mount.h defines statfs"" >&5 if eval "test \"`echo '$''{'wine_cv_sys_mount_has_statfs'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -5763,7 +5784,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:5767: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5788: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_sys_mount_has_statfs=yes else @@ -5789,7 +5810,7 @@ fi echo $ac_n "checking "for statfs.f_bfree"""... $ac_c" 1>&6 -echo "configure:5793: checking "for statfs.f_bfree"" >&5 +echo "configure:5814: checking "for statfs.f_bfree"" >&5 if eval "test \"`echo '$''{'wine_cv_statfs_bfree'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5798,7 +5819,7 @@ else wine_cv_statfs_bfree=no else cat > conftest.$ac_ext < @@ -5825,7 +5846,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:5829: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5850: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_statfs_bfree=yes else @@ -5849,7 +5870,7 @@ EOF fi echo $ac_n "checking "for statfs.f_bavail"""... $ac_c" 1>&6 -echo "configure:5853: checking "for statfs.f_bavail"" >&5 +echo "configure:5874: checking "for statfs.f_bavail"" >&5 if eval "test \"`echo '$''{'wine_cv_statfs_bavail'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5858,7 +5879,7 @@ else wine_cv_statfs_bavail=no else cat > conftest.$ac_ext < @@ -5885,7 +5906,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:5889: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:5910: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_statfs_bavail=yes else @@ -5910,7 +5931,7 @@ fi echo $ac_n "checking "for working sigaltstack"""... $ac_c" 1>&6 -echo "configure:5914: checking "for working sigaltstack"" >&5 +echo "configure:5935: checking "for working sigaltstack"" >&5 if eval "test \"`echo '$''{'ac_cv_c_working_sigaltstack'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5919,7 +5940,7 @@ else else cat > conftest.$ac_ext < @@ -5957,7 +5978,7 @@ else } EOF -if { (eval echo configure:5961: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:5982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_working_sigaltstack="yes" else @@ -5984,12 +6005,12 @@ fi echo $ac_n "checking "for msg_accrights in struct msghdr"""... $ac_c" 1>&6 -echo "configure:5988: checking "for msg_accrights in struct msghdr"" >&5 +echo "configure:6009: checking "for msg_accrights in struct msghdr"" >&5 if eval "test \"`echo '$''{'ac_cv_c_msg_accrights'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -5997,7 +6018,7 @@ int main() { struct msghdr hdr; hdr.msg_accrights=0 ; return 0; } EOF -if { (eval echo configure:6001: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:6022: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_msg_accrights="yes" else @@ -6020,12 +6041,12 @@ fi echo $ac_n "checking "for sun_len in struct sockaddr_un"""... $ac_c" 1>&6 -echo "configure:6024: checking "for sun_len in struct sockaddr_un"" >&5 +echo "configure:6045: checking "for sun_len in struct sockaddr_un"" >&5 if eval "test \"`echo '$''{'ac_cv_c_sun_len'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -6034,7 +6055,7 @@ int main() { static struct sockaddr_un addr; addr.sun_len = 1 ; return 0; } EOF -if { (eval echo configure:6038: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:6059: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_sun_len="yes" else @@ -6057,12 +6078,12 @@ fi echo $ac_n "checking "whether we need to define __i386__"""... $ac_c" 1>&6 -echo "configure:6061: checking "whether we need to define __i386__"" >&5 +echo "configure:6082: checking "whether we need to define __i386__"" >&5 if eval "test \"`echo '$''{'ac_cv_cpp_def_i386'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <screen_palents; + + for (y = height; y--; ) { +#if defined(__i386__) && defined(__GNUC__) + /* gcc generates slightly inefficient code for the the copy/lookup, + * it generates one excess memory access (to pal) per pixel. Since + * we know that pal is not modified by the memory write we can + * put it into a register and reduce the number of memory accesses + * from 4 to 3 pp. There are two xor eax,eax to avoid pipeline + * stalls. (This is not guaranteed to be the fastest method.) + */ + __asm__ __volatile__( + "xor %%eax,%%eax\n" + "1:\n" + " lodsb\n" + " movw (%%edx,%%eax,2),%%ax\n" + " stosw\n" + " xor %%eax,%%eax\n" + " loop 1b\n" + : "=S" (c_src), "=D" (c_dst) + : "S" (c_src), "D" (c_dst) , "c" (width), "d" (pal) + : "eax", "cc", "memory" + ); + c_src+=(pitch-width); +#else + unsigned char * srclineend = c_src+width; + while (c_src < srclineend) + *c_dst++ = pal[*c_src++]; + c_src+=(pitch-width); +#endif + } + } else { + WARN("No palette set...\n"); + memset(dst, 0, width * height * 2); + } +} +static void palette_convert_16_to_8( + LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count +) { + int i; + unsigned short *pal = (unsigned short *) screen_palette; + + for (i = 0; i < count; i++) + pal[start + i] = (((((unsigned short) palent[i].peRed) & 0xF8) << 8) | + ((((unsigned short) palent[i].peBlue) & 0xF8) >> 3) | + ((((unsigned short) palent[i].peGreen) & 0xFC) << 3)); +} + +static void palette_convert_15_to_8( + LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count +) { + int i; + unsigned short *pal = (unsigned short *) screen_palette; + + for (i = 0; i < count; i++) + pal[start + i] = (((((unsigned short) palent[i].peRed) & 0xF8) << 7) | + ((((unsigned short) palent[i].peBlue) & 0xF8) >> 3) | + ((((unsigned short) palent[i].peGreen) & 0xF8) << 2)); +} + +/* ************************************* + 24 to palettized 8 bpp + ************************************* */ +static void pixel_convert_24_to_8( + void *src, void *dst, DWORD width, DWORD height, LONG pitch, + IDirectDrawPaletteImpl* palette +) { + unsigned char *c_src = (unsigned char *) src; + unsigned char *c_dst = (unsigned char *) dst; + int y; + + if (palette != NULL) { + const unsigned int *pal = (unsigned int *) palette->screen_palents; + + for (y = height; y--; ) { + unsigned char * srclineend = c_src+width; + while (c_src < srclineend ) { + register long pixel = pal[*c_src++]; + *c_dst++ = pixel; + *c_dst++ = pixel>>8; + *c_dst++ = pixel>>16; + } + c_src+=(pitch-width); + } + } else { + WARN("No palette set...\n"); + memset(dst, 0, width * height * 4); + } +} + +/* ************************************* + 32 bpp to palettized 8 bpp + ************************************* */ +static void pixel_convert_32_to_8( + void *src, void *dst, DWORD width, DWORD height, LONG pitch, + IDirectDrawPaletteImpl* palette +) { + unsigned char *c_src = (unsigned char *) src; + unsigned int *c_dst = (unsigned int *) dst; + int y; + + if (palette != NULL) { + const unsigned int *pal = (unsigned int *) palette->screen_palents; + + for (y = height; y--; ) { +#if defined(__i386__) && defined(__GNUC__) + /* See comment in pixel_convert_16_to_8 */ + __asm__ __volatile__( + "xor %%eax,%%eax\n" + "1:\n" + " lodsb\n" + " movl (%%edx,%%eax,4),%%eax\n" + " stosl\n" + " xor %%eax,%%eax\n" + " loop 1b\n" + : "=S" (c_src), "=D" (c_dst) + : "S" (c_src), "D" (c_dst) , "c" (width), "d" (pal) + : "eax", "cc", "memory" + ); + c_src+=(pitch-width); +#else + unsigned char * srclineend = c_src+width; + while (c_src < srclineend ) + *c_dst++ = pal[*c_src++]; + c_src+=(pitch-width); +#endif + } + } else { + WARN("No palette set...\n"); + memset(dst, 0, width * height * 4); + } +} + +static void palette_convert_24_to_8( + LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count +) { + int i; + unsigned int *pal = (unsigned int *) screen_palette; + + for (i = 0; i < count; i++) + pal[start + i] = ((((unsigned int) palent[i].peRed) << 16) | + (((unsigned int) palent[i].peGreen) << 8) | + ((unsigned int) palent[i].peBlue)); +} + +/* ************************************* + 32 bpp to 16 bpp + ************************************* */ +static void pixel_convert_32_to_16( + void *src, void *dst, DWORD width, DWORD height, LONG pitch, + IDirectDrawPaletteImpl* palette +) { + unsigned short *c_src = (unsigned short *) src; + unsigned int *c_dst = (unsigned int *) dst; + int y; + + for (y = height; y--; ) { + unsigned short * srclineend = c_src+width; + while (c_src < srclineend ) { + *c_dst++ = (((*c_src & 0xF800) << 8) | + ((*c_src & 0x07E0) << 5) | + ((*c_src & 0x001F) << 3)); + c_src++; + } + c_src+=((pitch/2)-width); + } +} + +Convert ModeEmulations[5] = { + { { 32, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_32_to_8, palette_convert_24_to_8 } }, + { { 32, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { 16, 16, 0xF800, 0x07E0, 0x001F }, { pixel_convert_32_to_16, NULL } }, + { { 24, 24, 0xFF0000, 0x00FF00, 0x0000FF }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_24_to_8, palette_convert_24_to_8 } }, + { { 16, 16, 0xF800, 0x07E0, 0x001F }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_16_to_8, palette_convert_16_to_8 } }, + { { 16, 15, 0x7C00, 0x03E0, 0x001F }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_16_to_8, palette_convert_15_to_8 } }, +}; diff --git a/dlls/ddraw/d3d_private.h b/dlls/ddraw/d3d_private.h index 8ac67cc4fb5..dbadb95f19d 100644 --- a/dlls/ddraw/d3d_private.h +++ b/dlls/ddraw/d3d_private.h @@ -7,13 +7,10 @@ #ifndef __GRAPHICS_WINE_D3D_PRIVATE_H #define __GRAPHICS_WINE_D3D_PRIVATE_H -#include "wine_gl.h" +/* THIS FILE MUST NOT CONTAIN X11 or MESA DEFINES */ + #include "d3d.h" -#include "x11drv.h" - -#undef USE_OSMESA - /***************************************************************************** * Predeclare the interface implementation structures */ @@ -29,6 +26,9 @@ typedef struct IDirect3DDevice2Impl IDirect3DDevice2Impl; #include "ddraw_private.h" +extern ICOM_VTABLE(IDirect3D) mesa_d3dvt; +extern ICOM_VTABLE(IDirect3D2) mesa_d3d2vt; + /***************************************************************************** * IDirect3D implementation structure */ @@ -38,7 +38,8 @@ struct IDirect3DImpl ICOM_VFIELD(IDirect3D); DWORD ref; /* IDirect3D fields */ - IDirectDrawImpl* ddraw; + IDirectDrawImpl* ddraw; + LPVOID private; }; /***************************************************************************** @@ -50,9 +51,55 @@ struct IDirect3D2Impl ICOM_VFIELD(IDirect3D2); DWORD ref; /* IDirect3D2 fields */ - IDirectDrawImpl* ddraw; + IDirectDrawImpl* ddraw; + LPVOID private; }; +extern HRESULT WINAPI IDirect3DImpl_QueryInterface( + LPDIRECT3D iface,REFIID refiid,LPVOID *obj +); +extern ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface); +extern ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface) +; +extern HRESULT WINAPI IDirect3DImpl_Initialize(LPDIRECT3D iface,REFIID refiid); +extern HRESULT WINAPI IDirect3DImpl_EnumDevices( + LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context +); +extern HRESULT WINAPI IDirect3DImpl_CreateLight( + LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk +); +extern HRESULT WINAPI IDirect3DImpl_CreateMaterial( + LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk +); +extern HRESULT WINAPI IDirect3DImpl_CreateViewport( + LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk +); +extern HRESULT WINAPI IDirect3DImpl_FindDevice( + LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc, + LPD3DFINDDEVICERESULT lpfinddevrst) +; +extern HRESULT WINAPI IDirect3D2Impl_QueryInterface(LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj); +extern ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface); +extern ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface); +extern HRESULT WINAPI IDirect3D2Impl_EnumDevices( + LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context +); +extern HRESULT WINAPI IDirect3D2Impl_CreateLight( + LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk +); +extern HRESULT WINAPI IDirect3D2Impl_CreateMaterial( + LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk +); +extern HRESULT WINAPI IDirect3D2Impl_CreateViewport( + LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk +); +extern HRESULT WINAPI IDirect3D2Impl_FindDevice( + LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc, + LPD3DFINDDEVICERESULT lpfinddevrst); +extern HRESULT WINAPI IDirect3D2Impl_CreateDevice( + LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface, + LPDIRECT3DDEVICE2 *device); + /***************************************************************************** * IDirect3DLight implementation structure */ @@ -77,10 +124,7 @@ struct IDirect3DLightImpl void (*activate)(IDirect3DLightImpl*); int is_active; - /* Awful OpenGL code !!! */ -#ifdef HAVE_MESAGL - GLenum light_num; -#endif + LPVOID private; }; /***************************************************************************** @@ -105,6 +149,7 @@ struct IDirect3DMaterial2Impl D3DMATERIAL mat; void (*activate)(IDirect3DMaterial2Impl* this); + LPVOID private; }; /***************************************************************************** @@ -116,14 +161,37 @@ struct IDirect3DTexture2Impl ICOM_VFIELD(IDirect3DTexture2); DWORD ref; /* IDirect3DTexture2 fields */ - void* D3Ddevice; /* I put (void *) to use the same pointer for both - Direct3D and Direct3D2 */ -#ifdef HAVE_MESAGL - GLuint tex_name; -#endif - IDirectDrawSurface4Impl* surface; + void* D3Ddevice; /* (void *) to use the same pointer + * for both Direct3D and Direct3D2 */ + IDirectDrawSurface4Impl* surface; + LPVOID private; }; +extern HRESULT WINAPI IDirect3DTexture2Impl_QueryInterface( + LPDIRECT3DTEXTURE2 iface, REFIID riid, LPVOID* ppvObj +); +extern ULONG WINAPI IDirect3DTexture2Impl_AddRef(LPDIRECT3DTEXTURE2 iface); +extern ULONG WINAPI IDirect3DTexture2Impl_Release(LPDIRECT3DTEXTURE2 iface); +extern HRESULT WINAPI IDirect3DTextureImpl_GetHandle(LPDIRECT3DTEXTURE iface, + LPDIRECT3DDEVICE lpD3DDevice, + LPD3DTEXTUREHANDLE lpHandle) +; +extern HRESULT WINAPI IDirect3DTextureImpl_Initialize(LPDIRECT3DTEXTURE iface, + LPDIRECT3DDEVICE lpD3DDevice, + LPDIRECTDRAWSURFACE lpSurface) +; +extern HRESULT WINAPI IDirect3DTextureImpl_Unload(LPDIRECT3DTEXTURE iface); +extern HRESULT WINAPI IDirect3DTexture2Impl_GetHandle( + LPDIRECT3DTEXTURE2 iface, LPDIRECT3DDEVICE2 lpD3DDevice2, + LPD3DTEXTUREHANDLE lpHandle +); +extern HRESULT WINAPI IDirect3DTexture2Impl_PaletteChanged( + LPDIRECT3DTEXTURE2 iface, DWORD dwStart, DWORD dwCount +); +extern HRESULT WINAPI IDirect3DTexture2Impl_Load( + LPDIRECT3DTEXTURE2 iface, LPDIRECT3DTEXTURE2 lpD3DTexture2 +); + /***************************************************************************** * IDirect3DViewport2 implementation structure */ @@ -139,32 +207,84 @@ struct IDirect3DViewport2Impl } d3d; /* If this viewport is active for one device, put the device here */ union { - IDirect3DDeviceImpl* active_device1; - IDirect3DDevice2Impl* active_device2; + IDirect3DDeviceImpl* active_device1; + IDirect3DDevice2Impl* active_device2; } device; - int use_d3d2; + int use_d3d2; union { - D3DVIEWPORT vp1; - D3DVIEWPORT2 vp2; + D3DVIEWPORT vp1; + D3DVIEWPORT2 vp2; } viewport; - int use_vp2; + int use_vp2; /* Activation function */ void (*activate)(IDirect3DViewport2Impl*); /* Field used to chain viewports together */ - IDirect3DViewport2Impl* next; + IDirect3DViewport2Impl* next; /* Lights list */ - IDirect3DLightImpl* lights; - - /* OpenGL code */ -#ifdef HAVE_MESAGL - GLenum nextlight; -#endif + IDirect3DLightImpl* lights; + + LPVOID private; }; +extern HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface( + LPDIRECT3DVIEWPORT2 iface, REFIID riid, LPVOID* ppvObj +); +extern ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface) +; +extern ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface) +; +extern HRESULT WINAPI IDirect3DViewport2Impl_Initialize( + LPDIRECT3DVIEWPORT2 iface, LPDIRECT3D d3d +); +extern HRESULT WINAPI IDirect3DViewport2Impl_GetViewport( + LPDIRECT3DVIEWPORT2 iface, LPD3DVIEWPORT lpvp +); +extern HRESULT WINAPI IDirect3DViewport2Impl_SetViewport( + LPDIRECT3DVIEWPORT2 iface,LPD3DVIEWPORT lpvp +); +extern HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices( + LPDIRECT3DVIEWPORT2 iface,DWORD dwVertexCount,LPD3DTRANSFORMDATA lpData, + DWORD dwFlags,LPDWORD lpOffScreen +); +extern HRESULT WINAPI IDirect3DViewport2Impl_LightElements( + LPDIRECT3DVIEWPORT2 iface,DWORD dwElementCount,LPD3DLIGHTDATA lpData +); +extern HRESULT WINAPI IDirect3DViewport2Impl_SetBackground( + LPDIRECT3DVIEWPORT2 iface, D3DMATERIALHANDLE hMat +); +extern HRESULT WINAPI IDirect3DViewport2Impl_GetBackground( + LPDIRECT3DVIEWPORT2 iface,LPD3DMATERIALHANDLE lphMat,LPBOOL lpValid +); +extern HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth( + LPDIRECT3DVIEWPORT2 iface,LPDIRECTDRAWSURFACE lpDDSurface +); +extern HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth( + LPDIRECT3DVIEWPORT2 iface,LPDIRECTDRAWSURFACE* lplpDDSurface,LPBOOL lpValid +); +extern HRESULT WINAPI IDirect3DViewport2Impl_Clear( + LPDIRECT3DVIEWPORT2 iface, DWORD dwCount, LPD3DRECT lpRects, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DViewport2Impl_AddLight( + LPDIRECT3DVIEWPORT2 iface,LPDIRECT3DLIGHT lpLight +); +extern HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight( + LPDIRECT3DVIEWPORT2 iface,LPDIRECT3DLIGHT lpLight +); +extern HRESULT WINAPI IDirect3DViewport2Impl_NextLight( + LPDIRECT3DVIEWPORT2 iface, LPDIRECT3DLIGHT lpLight, + LPDIRECT3DLIGHT* lplpLight, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2( + LPDIRECT3DVIEWPORT2 iface, LPD3DVIEWPORT2 lpViewport2 +); +extern HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2( + LPDIRECT3DVIEWPORT2 iface, LPD3DVIEWPORT2 lpViewport2 +); + /***************************************************************************** * IDirect3DExecuteBuffer implementation structure */ @@ -190,7 +310,9 @@ struct IDirect3DExecuteBufferImpl void (*execute)(IDirect3DExecuteBuffer* this, IDirect3DDevice* dev, IDirect3DViewport2* vp); + LPVOID private; }; +extern LPDIRECT3DEXECUTEBUFFER d3dexecutebuffer_create(IDirect3DDeviceImpl* d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc); /***************************************************************************** * IDirect3DDevice implementation structure @@ -208,6 +330,7 @@ struct IDirect3DDeviceImpl IDirect3DViewport2Impl* current_viewport; void (*set_context)(IDirect3DDeviceImpl*); + LPVOID private; }; /***************************************************************************** @@ -226,118 +349,175 @@ struct IDirect3DDevice2Impl IDirect3DViewport2Impl* current_viewport; void (*set_context)(IDirect3DDevice2Impl*); + LPVOID private; }; - - - -#ifdef HAVE_MESAGL - -#ifdef USE_OSMESA -#define LEAVE_GL() ; -#define ENTER_GL() ; -#else -#define LEAVE_GL() LeaveCriticalSection( &X11DRV_CritSection ) -#define ENTER_GL() EnterCriticalSection( &X11DRV_CritSection ) -#endif - -/* Matrix copy WITH transposition */ -#define conv_mat2(mat,gl_mat) \ -{ \ - TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ - TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ - TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ - TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \ - (gl_mat)[ 0] = (mat)->_11; \ - (gl_mat)[ 1] = (mat)->_21; \ - (gl_mat)[ 2] = (mat)->_31; \ - (gl_mat)[ 3] = (mat)->_41; \ - (gl_mat)[ 4] = (mat)->_12; \ - (gl_mat)[ 5] = (mat)->_22; \ - (gl_mat)[ 6] = (mat)->_32; \ - (gl_mat)[ 7] = (mat)->_42; \ - (gl_mat)[ 8] = (mat)->_13; \ - (gl_mat)[ 9] = (mat)->_23; \ - (gl_mat)[10] = (mat)->_33; \ - (gl_mat)[11] = (mat)->_43; \ - (gl_mat)[12] = (mat)->_14; \ - (gl_mat)[13] = (mat)->_24; \ - (gl_mat)[14] = (mat)->_34; \ - (gl_mat)[15] = (mat)->_44; \ -}; - -/* Matrix copy WITHOUT transposition */ -#define conv_mat(mat,gl_mat) \ -{ \ - TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ - TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ - TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ - TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \ - memcpy(gl_mat, (mat), 16 * sizeof(float)); \ -}; - -#define dump_mat(mat) \ - TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ - TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ - TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ - TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); - -typedef struct render_state { - /* This is used for the device mode */ - GLenum src, dst; - /* This is used for textures */ - GLenum mag, min; -} RenderState; - -typedef struct OpenGL_IDirect3DDevice2 { - IDirect3DDevice2Impl common; - - /* These are the OpenGL-specific variables */ -#ifdef USE_OSMESA - OSMesaContext ctx; - unsigned char *buffer; -#else - GLXContext ctx; -#endif - - /* The current render state */ - RenderState rs; - - /* The last type of vertex drawn */ - D3DVERTEXTYPE vt; - - float world_mat[16]; - float view_mat[16]; - float proj_mat[16]; -} OpenGL_IDirect3DDevice2; - -typedef struct OpenGL_IDirect3DDevice { - IDirect3DDeviceImpl common; - - /* These are the OpenGL-specific variables */ -#ifdef USE_OSMESA - OSMesaContext ctx; - unsigned char *buffer; -#else - GLXContext ctx; -#endif - - /* The current render state */ - RenderState rs; - - D3DMATRIX *world_mat; - D3DMATRIX *view_mat; - D3DMATRIX *proj_mat; -} OpenGL_IDirect3DDevice; - -#define _dump_colorvalue(s,v) \ - TRACE(" " s " : %f %f %f %f\n", \ - (v).r.r, (v).g.g, (v).b.b, (v).a.a); - -/* Common functions defined in d3dcommon.c */ -void set_render_state(D3DRENDERSTATETYPE dwRenderStateType, - DWORD dwRenderState, RenderState *rs) ; - -#endif /* HAVE_MESAGL */ +extern HRESULT WINAPI IDirect3DDevice2Impl_QueryInterface( + LPDIRECT3DDEVICE2 iface, REFIID riid, LPVOID* ppvObj +); +extern ULONG WINAPI IDirect3DDevice2Impl_AddRef(LPDIRECT3DDEVICE2 iface); +extern ULONG WINAPI IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface) +; +extern HRESULT WINAPI IDirect3DDevice2Impl_GetCaps( + LPDIRECT3DDEVICE2 iface, LPD3DDEVICEDESC lpdescsoft, + LPD3DDEVICEDESC lpdeschard +); +extern HRESULT WINAPI IDirect3DDevice2Impl_SwapTextureHandles( + LPDIRECT3DDEVICE2 iface,LPDIRECT3DTEXTURE2 lptex1,LPDIRECT3DTEXTURE2 lptex2 +); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetStats( + LPDIRECT3DDEVICE2 iface, LPD3DSTATS lpstats) +; +extern HRESULT WINAPI IDirect3DDevice2Impl_AddViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp +); +extern HRESULT WINAPI IDirect3DDevice2Impl_DeleteViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp) +; +extern HRESULT WINAPI IDirect3DDevice2Impl_NextViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp, + LPDIRECT3DVIEWPORT2* lplpvp, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDevice2Impl_EnumTextureFormats( + LPDIRECT3DDEVICE2 iface, LPD3DENUMTEXTUREFORMATSCALLBACK cb, LPVOID context +); +extern HRESULT WINAPI IDirect3DDevice2Impl_BeginScene(LPDIRECT3DDEVICE2 iface); +extern HRESULT WINAPI IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetDirect3D( + LPDIRECT3DDEVICE2 iface, LPDIRECT3D2 *lpd3d2 +); +extern HRESULT WINAPI IDirect3DDevice2Impl_SetCurrentViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp +); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetCurrentViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 *lplpvp +); +extern HRESULT WINAPI IDirect3DDevice2Impl_SetRenderTarget( + LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetRenderTarget( + LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE *lplpdds +); +extern HRESULT WINAPI IDirect3DDevice2Impl_Begin( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDevice2Impl_BeginIndexed( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvert, DWORD numvert, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDevice2Impl_Vertex( + LPDIRECT3DDEVICE2 iface,LPVOID lpvert +); +extern HRESULT WINAPI IDirect3DDevice2Impl_Index(LPDIRECT3DDEVICE2 iface, WORD index); +extern HRESULT WINAPI IDirect3DDevice2Impl_End(LPDIRECT3DDEVICE2 iface,DWORD dwFlags); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetRenderState( + LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE d3drs, LPDWORD lprstate +); +extern HRESULT WINAPI IDirect3DDevice2Impl_SetRenderState( + LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE dwRenderStateType, + DWORD dwRenderState +); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetLightState( + LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE d3dls, LPDWORD lplstate +); +extern HRESULT WINAPI IDirect3DDevice2Impl_SetLightState( + LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE dwLightStateType, + DWORD dwLightState +); +extern HRESULT WINAPI IDirect3DDevice2Impl_SetTransform( + LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix +); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetTransform( + LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix +); +extern HRESULT WINAPI IDirect3DDevice2Impl_MultiplyTransform( + LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix +); +extern HRESULT WINAPI IDirect3DDevice2Impl_DrawPrimitive( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvertex, DWORD vertcount, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDevice2Impl_DrawIndexedPrimitive( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvertex, DWORD vertcount, LPWORD lpindexes, DWORD indexcount, + DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDevice2Impl_SetClipStatus( + LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs +); +extern HRESULT WINAPI IDirect3DDevice2Impl_GetClipStatus( + LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs +); +extern HRESULT WINAPI IDirect3DDeviceImpl_QueryInterface( + LPDIRECT3DDEVICE iface, REFIID riid, LPVOID* ppvObj +); +extern ULONG WINAPI IDirect3DDeviceImpl_AddRef(LPDIRECT3DDEVICE iface); +extern ULONG WINAPI IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface); +extern HRESULT WINAPI IDirect3DDeviceImpl_Initialize( + LPDIRECT3DDEVICE iface, LPDIRECT3D lpd3d, LPGUID lpGUID, + LPD3DDEVICEDESC lpd3ddvdesc +); +extern HRESULT WINAPI IDirect3DDeviceImpl_GetCaps( + LPDIRECT3DDEVICE iface, LPD3DDEVICEDESC lpD3DHWDevDesc, + LPD3DDEVICEDESC lpD3DSWDevDesc +); +extern HRESULT WINAPI IDirect3DDeviceImpl_SwapTextureHandles( + LPDIRECT3DDEVICE iface, LPDIRECT3DTEXTURE lpD3DTex1, + LPDIRECT3DTEXTURE lpD3DTex2 +); +extern HRESULT WINAPI IDirect3DDeviceImpl_CreateExecuteBuffer( + LPDIRECT3DDEVICE iface, LPD3DEXECUTEBUFFERDESC lpDesc, + LPDIRECT3DEXECUTEBUFFER *lplpDirect3DExecuteBuffer, IUnknown *pUnkOuter +); +extern HRESULT WINAPI IDirect3DDeviceImpl_GetStats( + LPDIRECT3DDEVICE iface, LPD3DSTATS lpD3DStats +); +extern HRESULT WINAPI IDirect3DDeviceImpl_Execute( + LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, + LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDeviceImpl_AddViewport( + LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp +); +extern HRESULT WINAPI IDirect3DDeviceImpl_DeleteViewport( + LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp +); +extern HRESULT WINAPI IDirect3DDeviceImpl_NextViewport( + LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp, + LPDIRECT3DVIEWPORT* lplpvp, DWORD dwFlags +); +extern HRESULT WINAPI IDirect3DDeviceImpl_Pick( + LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, + LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags, LPD3DRECT lpRect +); +extern HRESULT WINAPI IDirect3DDeviceImpl_GetPickRecords( + LPDIRECT3DDEVICE iface, LPDWORD lpCount, LPD3DPICKRECORD lpD3DPickRec +); +extern HRESULT WINAPI IDirect3DDeviceImpl_EnumTextureFormats( + LPDIRECT3DDEVICE iface,LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc, + LPVOID lpArg +); +extern HRESULT WINAPI IDirect3DDeviceImpl_CreateMatrix( + LPDIRECT3DDEVICE iface, LPD3DMATRIXHANDLE lpD3DMatHandle +) +; +extern HRESULT WINAPI IDirect3DDeviceImpl_SetMatrix( + LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle, + const LPD3DMATRIX lpD3DMatrix) +; +extern HRESULT WINAPI IDirect3DDeviceImpl_GetMatrix( + LPDIRECT3DDEVICE iface,D3DMATRIXHANDLE D3DMatHandle,LPD3DMATRIX lpD3DMatrix +); +extern HRESULT WINAPI IDirect3DDeviceImpl_DeleteMatrix( + LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle +); +extern HRESULT WINAPI IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface) +; +extern HRESULT WINAPI IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface) +; +extern HRESULT WINAPI IDirect3DDeviceImpl_GetDirect3D( + LPDIRECT3DDEVICE iface, LPDIRECT3D *lpDirect3D +); /* All non-static functions 'exported' by various sub-objects */ extern LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf); @@ -360,4 +540,12 @@ extern int d3d_OpenGL(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ; extern int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d); +extern void _dump_renderstate(D3DRENDERSTATETYPE type, DWORD value); + +#define dump_mat(mat) \ + TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ + TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ + TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ + TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); + #endif /* __GRAPHICS_WINE_D3D_PRIVATE_H */ diff --git a/dlls/ddraw/d3dcommon.c b/dlls/ddraw/d3dcommon.c index f217996cf37..c27582fc2fb 100644 --- a/dlls/ddraw/d3dcommon.c +++ b/dlls/ddraw/d3dcommon.c @@ -14,10 +14,7 @@ DEFAULT_DEBUG_CHANNEL(ddraw) -#ifdef HAVE_MESAGL - -static void _dump_renderstate(D3DRENDERSTATETYPE type, - DWORD value) { +void _dump_renderstate(D3DRENDERSTATETYPE type, DWORD value) { char *states[] = { NULL, "D3DRENDERSTATE_TEXTUREHANDLE", @@ -105,245 +102,5 @@ static void _dump_renderstate(D3DRENDERSTATETYPE type, "D3DRENDERSTATE_STIPPLEPATTERN30", "D3DRENDERSTATE_STIPPLEPATTERN31" }; - DPRINTF(" %s = 0x%08lx\n", states[type], value); } - - -void set_render_state(D3DRENDERSTATETYPE dwRenderStateType, - DWORD dwRenderState, RenderState *rs) -{ - - if (TRACE_ON(ddraw)) - _dump_renderstate(dwRenderStateType, dwRenderState); - - /* First, all the stipple patterns */ - if ((dwRenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00) && - (dwRenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31)) { - ERR("Unhandled stipple !\n"); - } else { - ENTER_GL(); - - /* All others state variables */ - switch (dwRenderStateType) { - - case D3DRENDERSTATE_TEXTUREHANDLE: { /* 1 */ - IDirect3DTexture2Impl* tex = (IDirect3DTexture2Impl*) dwRenderState; - - if (tex == NULL) { - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); - } else { - TRACE("setting OpenGL texture handle : %d\n", tex->tex_name); - glEnable(GL_TEXTURE_2D); - /* Default parameters */ - glBindTexture(GL_TEXTURE_2D, tex->tex_name); - /* To prevent state change, we could test here what are the parameters - stored in the texture */ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, rs->mag); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, rs->min); - } - } break; - - case D3DRENDERSTATE_TEXTUREPERSPECTIVE: /* 4 */ - if (dwRenderState) - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - else - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); - break; - - case D3DRENDERSTATE_ZENABLE: /* 7 */ - if (dwRenderState) - glEnable(GL_DEPTH_TEST); - else - glDisable(GL_DEPTH_TEST); - break; - - case D3DRENDERSTATE_FILLMODE: /* 8 */ - switch ((D3DFILLMODE) dwRenderState) { - case D3DFILL_SOLID: - break; - - default: - ERR("Unhandled fill mode !\n"); - } - break; - - case D3DRENDERSTATE_SHADEMODE: /* 9 */ - switch ((D3DSHADEMODE) dwRenderState) { - case D3DSHADE_FLAT: - glShadeModel(GL_FLAT); - break; - - case D3DSHADE_GOURAUD: - glShadeModel(GL_SMOOTH); - break; - - default: - ERR("Unhandled shade mode !\n"); - } - break; - - case D3DRENDERSTATE_ZWRITEENABLE: /* 14 */ - if (dwRenderState) - glDepthMask(GL_TRUE); - else - glDepthMask(GL_FALSE); - break; - - case D3DRENDERSTATE_TEXTUREMAG: /* 17 */ - switch ((D3DTEXTUREFILTER) dwRenderState) { - case D3DFILTER_NEAREST: - rs->mag = GL_NEAREST; - break; - - case D3DFILTER_LINEAR: - rs->mag = GL_LINEAR; - break; - - default: - ERR("Unhandled texture mag !\n"); - } - break; - - case D3DRENDERSTATE_TEXTUREMIN: /* 18 */ - switch ((D3DTEXTUREFILTER) dwRenderState) { - case D3DFILTER_NEAREST: - rs->min = GL_NEAREST; - break; - - case D3DFILTER_LINEAR: - rs->mag = GL_LINEAR; - break; - - default: - ERR("Unhandled texture min !\n"); - } - break; - - case D3DRENDERSTATE_SRCBLEND: /* 19 */ - switch ((D3DBLEND) dwRenderState) { - case D3DBLEND_SRCALPHA: - rs->src = GL_SRC_ALPHA; - break; - - default: - ERR("Unhandled blend mode !\n"); - } - - glBlendFunc(rs->src, rs->dst); - break; - - case D3DRENDERSTATE_DESTBLEND: /* 20 */ - switch ((D3DBLEND) dwRenderState) { - case D3DBLEND_INVSRCALPHA: - rs->dst = GL_ONE_MINUS_SRC_ALPHA; - break; - - default: - ERR("Unhandled blend mode !\n"); - } - - glBlendFunc(rs->src, rs->dst); - break; - - case D3DRENDERSTATE_TEXTUREMAPBLEND: /* 21 */ - switch ((D3DTEXTUREBLEND) dwRenderState) { - case D3DTBLEND_MODULATE: - case D3DTBLEND_MODULATEALPHA: - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - break; - - default: - ERR("Unhandled texture environment !\n"); - } - break; - - case D3DRENDERSTATE_CULLMODE: /* 22 */ - switch ((D3DCULL) dwRenderState) { - case D3DCULL_NONE: - glDisable(GL_CULL_FACE); - break; - - case D3DCULL_CW: - glEnable(GL_CULL_FACE); - glFrontFace(GL_CW); - break; - - case D3DCULL_CCW: - glEnable(GL_CULL_FACE); - glFrontFace(GL_CCW); - break; - - default: - ERR("Unhandled cull mode !\n"); - } - break; - - case D3DRENDERSTATE_ZFUNC: /* 23 */ - switch ((D3DCMPFUNC) dwRenderState) { - case D3DCMP_NEVER: - glDepthFunc(GL_NEVER); - break; - case D3DCMP_LESS: - glDepthFunc(GL_LESS); - break; - case D3DCMP_EQUAL: - glDepthFunc(GL_EQUAL); - break; - case D3DCMP_LESSEQUAL: - glDepthFunc(GL_LEQUAL); - break; - case D3DCMP_GREATER: - glDepthFunc(GL_GREATER); - break; - case D3DCMP_NOTEQUAL: - glDepthFunc(GL_NOTEQUAL); - break; - case D3DCMP_GREATEREQUAL: - glDepthFunc(GL_GEQUAL); - break; - case D3DCMP_ALWAYS: - glDepthFunc(GL_ALWAYS); - break; - - default: - ERR("Unexpected value\n"); - } - break; - - case D3DRENDERSTATE_DITHERENABLE: /* 26 */ - if (dwRenderState) - glEnable(GL_DITHER); - else - glDisable(GL_DITHER); - break; - - case D3DRENDERSTATE_ALPHABLENDENABLE: /* 27 */ - if (dwRenderState) - glEnable(GL_BLEND); - else - glDisable(GL_BLEND); - break; - - case D3DRENDERSTATE_COLORKEYENABLE: /* 41 */ - if (dwRenderState) - glEnable(GL_BLEND); - else - glDisable(GL_BLEND); - break; - - case D3DRENDERSTATE_FLUSHBATCH: /* 50 */ - break; - - default: - ERR("Unhandled Render State\n"); - break; - } - - LEAVE_GL(); - } -} - - -#endif /* HAVE_MESAGL */ diff --git a/dlls/ddraw/d3ddevice/main.c b/dlls/ddraw/d3ddevice/main.c new file mode 100644 index 00000000000..147ddfb4a69 --- /dev/null +++ b/dlls/ddraw/d3ddevice/main.c @@ -0,0 +1,699 @@ +/* Direct3D Device + (c) 1998 Lionel ULMER + + This files contains all the common stuff for D3D devices. + */ + +#include +#include "config.h" +#include "windef.h" +#include "winerror.h" +#include "wine/obj_base.h" +#include "heap.h" +#include "ddraw.h" +#include "d3d.h" +#include "debugtools.h" + +#include "d3d_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw) + +/******************************************************************************* + * IDirect3DDevice2 + */ + +HRESULT WINAPI IDirect3DDevice2Impl_QueryInterface( + LPDIRECT3DDEVICE2 iface, REFIID riid, LPVOID* ppvObj +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj); + return S_OK; +} + +ULONG WINAPI IDirect3DDevice2Impl_AddRef(LPDIRECT3DDEVICE2 iface) +{ + ICOM_THIS(IDirect3DDevice2Impl,iface); + TRACE("(%p)->()incrementing from %lu.\n", This, This->ref ); + + return ++(This->ref); +} + + + +ULONG WINAPI IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface) +{ + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + + +/*** IDirect3DDevice2 methods ***/ +HRESULT WINAPI IDirect3DDevice2Impl_GetCaps( + LPDIRECT3DDEVICE2 iface, LPD3DDEVICEDESC lpdescsoft, + LPD3DDEVICEDESC lpdeschard +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p,%p), stub!\n", This, lpdescsoft, lpdeschard); + return DD_OK; +} + + + +HRESULT WINAPI IDirect3DDevice2Impl_SwapTextureHandles( + LPDIRECT3DDEVICE2 iface,LPDIRECT3DTEXTURE2 lptex1,LPDIRECT3DTEXTURE2 lptex2 +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lptex1, lptex2); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_GetStats( + LPDIRECT3DDEVICE2 iface, LPD3DSTATS lpstats) +{ + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p): stub\n", This, lpstats); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_AddViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; + FIXME("(%p)->(%p): stub\n", This, ilpvp); + + /* Adds this viewport to the viewport list */ + ilpvp->next = This->viewport_list; + This->viewport_list = ilpvp; + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_DeleteViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp) +{ + ICOM_THIS(IDirect3DDevice2Impl,iface); + IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; + IDirect3DViewport2Impl *cur, *prev; + FIXME("(%p)->(%p): stub\n", This, lpvp); + + /* Finds this viewport in the list */ + prev = NULL; + cur = This->viewport_list; + while ((cur != NULL) && (cur != ilpvp)) { + prev = cur; + cur = cur->next; + } + if (cur == NULL) + return DDERR_INVALIDOBJECT; + + /* And remove it */ + if (prev == NULL) + This->viewport_list = cur->next; + else + prev->next = cur->next; + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_NextViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp, + LPDIRECT3DVIEWPORT2* lplpvp, DWORD dwFlags +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; + IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp; + FIXME("(%p)->(%p,%p,%08lx): stub\n", This, lpvp, lpvp, dwFlags); + + switch (dwFlags) { + case D3DNEXT_NEXT: + *ilplpvp = ilpvp->next; + break; + case D3DNEXT_HEAD: + *ilplpvp = This->viewport_list; + break; + case D3DNEXT_TAIL: + ilpvp = This->viewport_list; + while (ilpvp->next != NULL) + ilpvp = ilpvp->next; + *ilplpvp = ilpvp; + break; + default: + return DDERR_INVALIDPARAMS; + } + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_EnumTextureFormats( + LPDIRECT3DDEVICE2 iface, LPD3DENUMTEXTUREFORMATSCALLBACK cb, LPVOID context +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p,%p), stub!\n", This, cb, context); + + return DD_OK; /* no texture formats in stub implementation */ +} + + + +HRESULT WINAPI IDirect3DDevice2Impl_BeginScene(LPDIRECT3DDEVICE2 iface) +{ + ICOM_THIS(IDirect3DDevice2Impl,iface); + + FIXME("(%p)->(), stub!\n", This); + + /* Here, we should get the DDraw surface and 'copy it' to the + OpenGL surface.... */ + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface) +{ + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(): stub\n", This); + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_GetDirect3D( + LPDIRECT3DDEVICE2 iface, LPDIRECT3D2 *lpd3d2 +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + TRACE("(%p)->(%p): stub\n", This, lpd3d2); + *lpd3d2 = (LPDIRECT3D2)This->d3d; + return DD_OK; +} + +/*** DrawPrimitive API ***/ +HRESULT WINAPI IDirect3DDevice2Impl_SetCurrentViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; + FIXME("(%p)->(%p): stub\n", This, ilpvp); + + /* Should check if the viewport was added or not */ + + /* Set this viewport as the current viewport */ + This->current_viewport = ilpvp; + + /* Activate this viewport */ + ilpvp->device.active_device2 = This; + ilpvp->activate(ilpvp); + + return DD_OK; +} + + + +HRESULT WINAPI IDirect3DDevice2Impl_GetCurrentViewport( + LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 *lplpvp +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p): stub\n", This, lplpvp); + + /* Returns the current viewport */ + *lplpvp = (LPDIRECT3DVIEWPORT2)This->current_viewport; + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_SetRenderTarget( + LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p,%08lx): stub\n", This, lpdds, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_GetRenderTarget( + LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE *lplpdds +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p): stub\n", This, lplpdds); + + /* Returns the current rendering target (the surface on wich we render) */ + *lplpdds = (LPDIRECTDRAWSURFACE)This->surface; + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_Begin( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + DWORD dwFlags +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%d,%08lx): stub\n", This, d3dp, d3dv, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_BeginIndexed( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvert, DWORD numvert, DWORD dwFlags +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvert, numvert, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_Vertex( + LPDIRECT3DDEVICE2 iface,LPVOID lpvert +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p): stub\n", This, lpvert); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_Index(LPDIRECT3DDEVICE2 iface, WORD index) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d): stub\n", This, index); + + return DD_OK; +} + + + +HRESULT WINAPI IDirect3DDevice2Impl_End(LPDIRECT3DDEVICE2 iface,DWORD dwFlags) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%08lx): stub\n", This, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_GetRenderState( + LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE d3drs, LPDWORD lprstate +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%p): stub\n", This, d3drs, lprstate); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_SetRenderState( + LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE dwRenderStateType, + DWORD dwRenderState +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + + FIXME("(%p)->(%d,%ld)\n", This, dwRenderStateType, dwRenderState); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_GetLightState( + LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE d3dls, LPDWORD lplstate +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%p): stub\n", This, d3dls, lplstate); + + return DD_OK; +} + + + +HRESULT WINAPI IDirect3DDevice2Impl_SetLightState( + LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE dwLightStateType, + DWORD dwLightState +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%08lx): stub\n", This, dwLightStateType, dwLightState); + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_SetTransform( + LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%p),stub!\n",This,d3dts,lpmatrix); + return DD_OK; +} + + + +HRESULT WINAPI IDirect3DDevice2Impl_GetTransform( + LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix); + + return DD_OK; +} + + + +HRESULT WINAPI IDirect3DDevice2Impl_MultiplyTransform( + LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_DrawPrimitive( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvertex, DWORD vertcount, DWORD dwFlags +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + + TRACE("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, dwFlags); + + return D3D_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_DrawIndexedPrimitive( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvertex, DWORD vertcount, LPWORD lpindexes, DWORD indexcount, + DWORD dwFlags +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + TRACE("(%p)->(%d,%d,%p,%ld,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, lpindexes, indexcount, dwFlags); + return D3D_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_SetClipStatus( + LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p): stub\n", This, lpcs); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDevice2Impl_GetClipStatus( + LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs +) { + ICOM_THIS(IDirect3DDevice2Impl,iface); + FIXME("(%p)->(%p): stub\n", This, lpcs); + + return DD_OK; +} + +/******************************************************************************* + * Direct3DDevice + */ +HRESULT WINAPI IDirect3DDeviceImpl_QueryInterface( + LPDIRECT3DDEVICE iface, REFIID riid, LPVOID* ppvObj +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj); + return S_OK; +} + +ULONG WINAPI IDirect3DDeviceImpl_AddRef(LPDIRECT3DDEVICE iface) +{ + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->()incrementing from %lu.\n", This, This->ref ); + + return ++(This->ref); +} + +ULONG WINAPI IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface) +{ + ICOM_THIS(IDirect3DDeviceImpl,iface); + FIXME("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + +HRESULT WINAPI IDirect3DDeviceImpl_Initialize( + LPDIRECT3DDEVICE iface, LPDIRECT3D lpd3d, LPGUID lpGUID, + LPD3DDEVICEDESC lpd3ddvdesc +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p,%p): stub\n", This, lpd3d,lpGUID, lpd3ddvdesc); + + return DDERR_ALREADYINITIALIZED; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_GetCaps( + LPDIRECT3DDEVICE iface, LPD3DDEVICEDESC lpD3DHWDevDesc, + LPD3DDEVICEDESC lpD3DSWDevDesc +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpD3DHWDevDesc, lpD3DSWDevDesc); + + return DD_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_SwapTextureHandles( + LPDIRECT3DDEVICE iface, LPDIRECT3DTEXTURE lpD3DTex1, + LPDIRECT3DTEXTURE lpD3DTex2 +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpD3DTex1, lpD3DTex2); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDeviceImpl_CreateExecuteBuffer( + LPDIRECT3DDEVICE iface, LPD3DEXECUTEBUFFERDESC lpDesc, + LPDIRECT3DEXECUTEBUFFER *lplpDirect3DExecuteBuffer, IUnknown *pUnkOuter +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p,%p)\n", This, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter); + *lplpDirect3DExecuteBuffer = d3dexecutebuffer_create(This, lpDesc); + return DD_OK; +} + +HRESULT WINAPI IDirect3DDeviceImpl_GetStats( + LPDIRECT3DDEVICE iface, LPD3DSTATS lpD3DStats +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p): stub\n", This, lpD3DStats); + + return DD_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_Execute( + LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, + LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p,%08ld): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags); + + /* Put this as the default context */ + + /* Execute... */ + ((IDirect3DExecuteBufferImpl*)lpDirect3DExecuteBuffer)->execute(lpDirect3DExecuteBuffer, iface, lpDirect3DViewport); + + return DD_OK; +} + +HRESULT WINAPI IDirect3DDeviceImpl_AddViewport( + LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; + FIXME("(%p)->(%p): stub\n", This, ilpvp); + + /* Adds this viewport to the viewport list */ + ilpvp->next = This->viewport_list; + This->viewport_list = ilpvp; + + return DD_OK; +} + + + +HRESULT WINAPI IDirect3DDeviceImpl_DeleteViewport( + LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; + IDirect3DViewport2Impl *cur, *prev; + FIXME("(%p)->(%p): stub\n", This, lpvp); + + /* Finds this viewport in the list */ + prev = NULL; + cur = This->viewport_list; + while ((cur != NULL) && (cur != ilpvp)) { + prev = cur; + cur = cur->next; + } + if (cur == NULL) + return DDERR_INVALIDOBJECT; + + /* And remove it */ + if (prev == NULL) + This->viewport_list = cur->next; + else + prev->next = cur->next; + return DD_OK; +} + +HRESULT WINAPI IDirect3DDeviceImpl_NextViewport( + LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp, + LPDIRECT3DVIEWPORT* lplpvp, DWORD dwFlags +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; + IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp; + FIXME("(%p)->(%p,%p,%08lx): stub\n", This, ilpvp, ilplpvp, dwFlags); + + switch (dwFlags) { + case D3DNEXT_NEXT: + *ilplpvp = ilpvp->next; + break; + case D3DNEXT_HEAD: + *ilplpvp = This->viewport_list; + break; + case D3DNEXT_TAIL: + ilpvp = This->viewport_list; + while (ilpvp->next != NULL) + ilpvp = ilpvp->next; + *ilplpvp = ilpvp; + break; + default: + return DDERR_INVALIDPARAMS; + } + return DD_OK; +} + +HRESULT WINAPI IDirect3DDeviceImpl_Pick( + LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, + LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags, LPD3DRECT lpRect +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p,%08lx,%p): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags, lpRect); + return DD_OK; +} + +HRESULT WINAPI IDirect3DDeviceImpl_GetPickRecords( + LPDIRECT3DDEVICE iface, LPDWORD lpCount, LPD3DPICKRECORD lpD3DPickRec +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpCount, lpD3DPickRec); + + return DD_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_EnumTextureFormats( + LPDIRECT3DDEVICE iface,LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc, + LPVOID lpArg +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpd3dEnumTextureProc, lpArg); + return D3D_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_CreateMatrix( + LPDIRECT3DDEVICE iface, LPD3DMATRIXHANDLE lpD3DMatHandle +) +{ + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p)\n", This, lpD3DMatHandle); + + *lpD3DMatHandle = (D3DMATRIXHANDLE) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(D3DMATRIX)); + + return DD_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_SetMatrix( + LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle, + const LPD3DMATRIX lpD3DMatrix) +{ + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%08lx,%p)\n", This, d3dMatHandle, lpD3DMatrix); + + dump_mat(lpD3DMatrix); + *((D3DMATRIX *) d3dMatHandle) = *lpD3DMatrix; + return DD_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_GetMatrix( + LPDIRECT3DDEVICE iface,D3DMATRIXHANDLE D3DMatHandle,LPD3DMATRIX lpD3DMatrix +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%08lx,%p)\n", This, D3DMatHandle, lpD3DMatrix); + + *lpD3DMatrix = *((D3DMATRIX *) D3DMatHandle); + + return DD_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_DeleteMatrix( + LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%08lx)\n", This, d3dMatHandle); + HeapFree(GetProcessHeap(),0, (void *) d3dMatHandle); + return DD_OK; +} + + +HRESULT WINAPI IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface) +{ + ICOM_THIS(IDirect3DDeviceImpl,iface); + FIXME("(%p)->(): stub\n", This); + return DD_OK; +} + +/* This is for the moment copy-pasted from IDirect3DDevice2... + Will make a common function ... */ +HRESULT WINAPI IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface) +{ + ICOM_THIS(IDirect3DDeviceImpl,iface); + FIXME("(%p)->(): stub\n", This); + return DD_OK; +} + +HRESULT WINAPI IDirect3DDeviceImpl_GetDirect3D( + LPDIRECT3DDEVICE iface, LPDIRECT3D *lpDirect3D +) { + ICOM_THIS(IDirect3DDeviceImpl,iface); + TRACE("(%p)->(%p): stub\n", This, lpDirect3D); + + return DD_OK; +} + +/******************************************************************************* + * Direct3DDevice VTable + */ +static WINE_UNUSED ICOM_VTABLE(IDirect3DDevice) d3d_d3ddevice_vtbl = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirect3DDeviceImpl_QueryInterface, + IDirect3DDeviceImpl_AddRef, + IDirect3DDeviceImpl_Release, + IDirect3DDeviceImpl_Initialize, + IDirect3DDeviceImpl_GetCaps, + IDirect3DDeviceImpl_SwapTextureHandles, + IDirect3DDeviceImpl_CreateExecuteBuffer, + IDirect3DDeviceImpl_GetStats, + IDirect3DDeviceImpl_Execute, + IDirect3DDeviceImpl_AddViewport, + IDirect3DDeviceImpl_DeleteViewport, + IDirect3DDeviceImpl_NextViewport, + IDirect3DDeviceImpl_Pick, + IDirect3DDeviceImpl_GetPickRecords, + IDirect3DDeviceImpl_EnumTextureFormats, + IDirect3DDeviceImpl_CreateMatrix, + IDirect3DDeviceImpl_SetMatrix, + IDirect3DDeviceImpl_GetMatrix, + IDirect3DDeviceImpl_DeleteMatrix, + IDirect3DDeviceImpl_BeginScene, + IDirect3DDeviceImpl_EndScene, + IDirect3DDeviceImpl_GetDirect3D, +}; diff --git a/dlls/ddraw/d3ddevices.c b/dlls/ddraw/d3ddevice/mesa.c similarity index 50% rename from dlls/ddraw/d3ddevices.c rename to dlls/ddraw/d3ddevice/mesa.c index efe730ea41f..0608a56c726 100644 --- a/dlls/ddraw/d3ddevices.c +++ b/dlls/ddraw/d3ddevice/mesa.c @@ -1,8 +1,8 @@ /* Direct3D Device (c) 1998 Lionel ULMER - This files contains all the D3D devices that Wine supports. For the moment - only the 'OpenGL' target is supported. */ + This files contains the MESA implementation of all the D3D devices that + Wine supports. */ #include #include "config.h" @@ -14,74 +14,41 @@ #include "d3d.h" #include "debugtools.h" -#include "d3d_private.h" +#include "mesa_private.h" DEFAULT_DEBUG_CHANNEL(ddraw) +ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable; +ICOM_VTABLE(IDirect3DDevice) OpenGL_vtable_dx3; + /* Define this variable if you have an unpatched Mesa 3.0 (patches are available on Mesa's home page) or version 3.1b. Version 3.1b2 should correct this bug */ #undef HAVE_BUGGY_MESAGL -#ifdef HAVE_MESAGL - -static GUID IID_D3DDEVICE2_OpenGL = { - 0x39a0da38, - 0x7e57, - 0x11d2, - { 0x8b,0x7c,0x0e,0x4e,0xd8,0x3c,0x2b,0x3c } -}; - -static GUID IID_D3DDEVICE_OpenGL = { - 0x31416d44, - 0x86ae, - 0x11d2, - { 0x82,0x2d,0xa8,0xd5,0x31,0x87,0xca,0xfa } -}; - - -static ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable; -static ICOM_VTABLE(IDirect3DDevice) OpenGL_vtable_dx3; +#define D3DDPRIVATE(x) mesa_d3dd_private *odev=((mesa_d3dd_private*)x->private) +#define DDPRIVATE(x) x11_dd_private *ddpriv=((x11_dd_private*)(x)->private) /******************************************************************************* * OpenGL static functions */ static void set_context(IDirect3DDevice2Impl* This) { - OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; + D3DDPRIVATE(This); + DDPRIVATE(This->surface->s.ddraw); #ifdef USE_OSMESA - OSMesaMakeCurrent(odev->ctx, odev->buffer, - GL_UNSIGNED_BYTE, + OSMesaMakeCurrent(d3ddpriv->ctx, odev->buffer, GL_UNSIGNED_BYTE, This->surface->s.surface_desc.dwWidth, This->surface->s.surface_desc.dwHeight); #else - if (glXMakeCurrent(display, - odev->common.surface->s.ddraw->d.drawable, - odev->ctx) == False) { - ERR("Error in setting current context (context %p drawable %ld)!\n", - odev->ctx, odev->common.surface->s.ddraw->d.drawable); + if (glXMakeCurrent(display,ddpriv->drawable, odev->ctx) == False) { + ERR("Error in setting current context (context %p drawable %ld)!\n", + odev->ctx, ddpriv->drawable); } #endif } -static void set_context_dx3(IDirect3DDeviceImpl* This) { - OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This; - -#ifdef USE_OSMESA - OSMesaMakeCurrent(odev->ctx, odev->buffer, - GL_UNSIGNED_BYTE, - This->surface->s.surface_desc.dwWidth, - This->surface->s.surface_desc.dwHeight); -#else - if (glXMakeCurrent(display, - odev->common.surface->s.ddraw->d.drawable, - odev->ctx) == False) { - ERR("Error in setting current context !\n"); - } -#endif -} - static void fill_opengl_primcaps(D3DPRIMCAPS *pc) { pc->dwSize = sizeof(*pc); @@ -143,23 +110,24 @@ static void fill_opengl_caps(D3DDEVICEDESC *d1, D3DDEVICEDESC *d2) int d3d_OpenGL(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) { D3DDEVICEDESC d1,d2; - TRACE(" Enumerating OpenGL D3D device.\n"); - fill_opengl_caps(&d1, &d2); - return cb((void*)&IID_D3DDEVICE2_OpenGL,"WINE Direct3D using OpenGL","direct3d",&d1,&d2,context); } -int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d) -{ +int +is_OpenGL( + REFCLSID rguid, IDirectDrawSurfaceImpl* surface, + IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d +) { + mesa_d3dd_private *odev = NULL; + if (/* Default device */ (rguid == NULL) || /* HAL Device */ (!memcmp(&IID_IDirect3DHALDevice,rguid,sizeof(IID_IDirect3DHALDevice))) || /* OpenGL Device */ (!memcmp(&IID_D3DDEVICE2_OpenGL,rguid,sizeof(IID_D3DDEVICE2_OpenGL)))) { - OpenGL_IDirect3DDevice2 *odev; const float id_mat[16] = { 1.0, 0.0, 0.0, 0.0, @@ -172,20 +140,18 @@ int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2I XVisualInfo *xvis; #endif - *device = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(OpenGL_IDirect3DDevice2)); - odev = (OpenGL_IDirect3DDevice2 *) (*device); + *device = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DDevice2Impl)); + (*device)->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dd_private)); + odev = (mesa_d3dd_private*)(*device)->private; (*device)->ref = 1; ICOM_VTBL(*device) = &OpenGL_vtable; (*device)->d3d = d3d; (*device)->surface = surface; - (*device)->viewport_list = NULL; (*device)->current_viewport = NULL; - (*device)->set_context = set_context; TRACE("Creating OpenGL device for surface %p\n", surface); - /* Create the OpenGL context */ #ifdef USE_OSMESA odev->ctx = OSMesaCreateContext(OSMESA_RGBA, NULL); @@ -213,8 +179,10 @@ int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2I else TRACE("Context created (%p)\n", odev->ctx); +#if 0 /* not functional currently */ /* Now override the surface's Flip method (if in double buffering) */ surface->s.d3d_device = (void *) odev; + { int i; struct _surface_chain *chain = surface->s.chain; @@ -222,6 +190,8 @@ int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2I if (chain->surfaces[i]->s.surface_desc.ddsCaps.dwCaps & DDSCAPS_FLIP) chain->surfaces[i]->s.d3d_device = (void *) odev; } +#endif + #endif odev->rs.src = GL_ONE; odev->rs.dst = GL_ZERO; @@ -240,182 +210,46 @@ int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2I glClearColor(0.0, 0.0, 0.0, 0.0); glColor3f(1.0, 1.0, 1.0); LEAVE_GL(); - TRACE("OpenGL device created \n"); - return 1; } - + FIXME("bad IID %s\n",debugstr_guid(rguid)); /* This is not the OpenGL UID */ return 0; } /******************************************************************************* - * Common IDirect3DDevice2 + * MESA IDirect3DDevice2 */ - -static HRESULT WINAPI IDirect3DDevice2Impl_QueryInterface(LPDIRECT3DDEVICE2 iface, - REFIID riid, - LPVOID* ppvObj) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - - FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj); - - return S_OK; -} - - - -static ULONG WINAPI IDirect3DDevice2Impl_AddRef(LPDIRECT3DDEVICE2 iface) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - TRACE("(%p)->()incrementing from %lu.\n", This, This->ref ); - - return ++(This->ref); -} - - - -static ULONG WINAPI IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface) +static ULONG WINAPI MESA_IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface) { ICOM_THIS(IDirect3DDevice2Impl,iface); + D3DDPRIVATE(This); FIXME("(%p)->() decrementing from %lu.\n", This, This->ref ); if (!--(This->ref)) { - OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; - #ifdef USE_OSMESA OSMesaDestroyContext(odev->ctx); #else ENTER_GL(); - glXDestroyContext(display, - odev->ctx); + glXDestroyContext(display, odev->ctx); LEAVE_GL(); #endif - + This->private = NULL; HeapFree(GetProcessHeap(),0,This); return 0; } - return This->ref; } - /*** IDirect3DDevice2 methods ***/ -static HRESULT WINAPI IDirect3DDevice2Impl_GetCaps(LPDIRECT3DDEVICE2 iface, - LPD3DDEVICEDESC lpdescsoft, - LPD3DDEVICEDESC lpdeschard) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_GetCaps( + LPDIRECT3DDEVICE2 iface, LPD3DDEVICEDESC lpdescsoft, + LPD3DDEVICEDESC lpdeschard +) { ICOM_THIS(IDirect3DDevice2Impl,iface); FIXME("(%p)->(%p,%p): stub\n", This, lpdescsoft, lpdeschard); - fill_opengl_caps(lpdescsoft, lpdeschard); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_SwapTextureHandles(LPDIRECT3DDEVICE2 iface, - LPDIRECT3DTEXTURE2 lptex1, - LPDIRECT3DTEXTURE2 lptex2) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p,%p): stub\n", This, lptex1, lptex2); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetStats(LPDIRECT3DDEVICE2 iface, - LPD3DSTATS lpstats) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p): stub\n", This, lpstats); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_AddViewport(LPDIRECT3DDEVICE2 iface, - LPDIRECT3DVIEWPORT2 lpvp) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; - FIXME("(%p)->(%p): stub\n", This, ilpvp); - - /* Adds this viewport to the viewport list */ - ilpvp->next = This->viewport_list; - This->viewport_list = ilpvp; - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_DeleteViewport(LPDIRECT3DDEVICE2 iface, - LPDIRECT3DVIEWPORT2 lpvp) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; - IDirect3DViewport2Impl *cur, *prev; - FIXME("(%p)->(%p): stub\n", This, lpvp); - - /* Finds this viewport in the list */ - prev = NULL; - cur = This->viewport_list; - while ((cur != NULL) && (cur != ilpvp)) { - prev = cur; - cur = cur->next; - } - if (cur == NULL) - return DDERR_INVALIDOBJECT; - - /* And remove it */ - if (prev == NULL) - This->viewport_list = cur->next; - else - prev->next = cur->next; - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_NextViewport(LPDIRECT3DDEVICE2 iface, - LPDIRECT3DVIEWPORT2 lpvp, - LPDIRECT3DVIEWPORT2* lplpvp, - DWORD dwFlags) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; - IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp; - FIXME("(%p)->(%p,%p,%08lx): stub\n", This, lpvp, lpvp, dwFlags); - - switch (dwFlags) { - case D3DNEXT_NEXT: - *ilplpvp = ilpvp->next; - break; - - case D3DNEXT_HEAD: - *ilplpvp = This->viewport_list; - break; - - case D3DNEXT_TAIL: - ilpvp = This->viewport_list; - while (ilpvp->next != NULL) - ilpvp = ilpvp->next; - - *ilplpvp = ilpvp; - break; - - default: - return DDERR_INVALIDPARAMS; - } - return DD_OK; } @@ -513,22 +347,19 @@ static HRESULT enum_texture_format_OpenGL(LPD3DENUMTEXTUREFORMATSCALLBACK cb, return DD_OK; } -static HRESULT WINAPI IDirect3DDevice2Impl_EnumTextureFormats(LPDIRECT3DDEVICE2 iface, - LPD3DENUMTEXTUREFORMATSCALLBACK cb, - LPVOID context) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_EnumTextureFormats( + LPDIRECT3DDEVICE2 iface, LPD3DENUMTEXTUREFORMATSCALLBACK cb, LPVOID context +) { ICOM_THIS(IDirect3DDevice2Impl,iface); FIXME("(%p)->(%p,%p): stub\n", This, cb, context); return enum_texture_format_OpenGL(cb, context); } - - -static HRESULT WINAPI IDirect3DDevice2Impl_BeginScene(LPDIRECT3DDEVICE2 iface) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_BeginScene( + LPDIRECT3DDEVICE2 iface +) { ICOM_THIS(IDirect3DDevice2Impl,iface); - /* OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; */ FIXME("(%p)->(): stub\n", This); @@ -538,13 +369,11 @@ static HRESULT WINAPI IDirect3DDevice2Impl_BeginScene(LPDIRECT3DDEVICE2 iface) return DD_OK; } - - -static HRESULT WINAPI IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface) -{ +HRESULT WINAPI MESA_IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface) { ICOM_THIS(IDirect3DDevice2Impl,iface); #ifdef USE_OSMESA - OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; + D3DPRIVATE(This); + LPDIRECTDRAWSURFACE3 surf = (LPDIRECTDRAWSURFACE3) This->surface; DDSURFACEDESC sdesc; int x,y; @@ -592,162 +421,12 @@ static HRESULT WINAPI IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface) return DD_OK; } - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetDirect3D(LPDIRECT3DDEVICE2 iface, LPDIRECT3D2 *lpd3d2) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_SetRenderState( + LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE dwRenderStateType, + DWORD dwRenderState +) { ICOM_THIS(IDirect3DDevice2Impl,iface); - TRACE("(%p)->(%p): stub\n", This, lpd3d2); - - *lpd3d2 = (LPDIRECT3D2)This->d3d; - - return DD_OK; -} - - - -/*** DrawPrimitive API ***/ -static HRESULT WINAPI IDirect3DDevice2Impl_SetCurrentViewport(LPDIRECT3DDEVICE2 iface, - LPDIRECT3DVIEWPORT2 lpvp) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; - FIXME("(%p)->(%p): stub\n", This, ilpvp); - - /* Should check if the viewport was added or not */ - - /* Set this viewport as the current viewport */ - This->current_viewport = ilpvp; - - /* Activate this viewport */ - ilpvp->device.active_device2 = This; - ilpvp->activate(ilpvp); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetCurrentViewport(LPDIRECT3DDEVICE2 iface, - LPDIRECT3DVIEWPORT2 *lplpvp) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p): stub\n", This, lplpvp); - - /* Returns the current viewport */ - *lplpvp = (LPDIRECT3DVIEWPORT2)This->current_viewport; - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_SetRenderTarget(LPDIRECT3DDEVICE2 iface, - LPDIRECTDRAWSURFACE lpdds, - DWORD dwFlags) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p,%08lx): stub\n", This, lpdds, dwFlags); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetRenderTarget(LPDIRECT3DDEVICE2 iface, - LPDIRECTDRAWSURFACE *lplpdds) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p): stub\n", This, lplpdds); - - /* Returns the current rendering target (the surface on wich we render) */ - *lplpdds = (LPDIRECTDRAWSURFACE)This->surface; - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_Begin(LPDIRECT3DDEVICE2 iface, - D3DPRIMITIVETYPE d3dp, - D3DVERTEXTYPE d3dv, - DWORD dwFlags) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%d,%d,%08lx): stub\n", This, d3dp, d3dv, dwFlags); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_BeginIndexed(LPDIRECT3DDEVICE2 iface, - D3DPRIMITIVETYPE d3dp, - D3DVERTEXTYPE d3dv, - LPVOID lpvert, - DWORD numvert, - DWORD dwFlags) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvert, numvert, dwFlags); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_Vertex(LPDIRECT3DDEVICE2 iface, - LPVOID lpvert) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p): stub\n", This, lpvert); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_Index(LPDIRECT3DDEVICE2 iface, - WORD index) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%d): stub\n", This, index); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_End(LPDIRECT3DDEVICE2 iface, - DWORD dwFlags) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%08lx): stub\n", This, dwFlags); - - return DD_OK; -} - - - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetRenderState(LPDIRECT3DDEVICE2 iface, - D3DRENDERSTATETYPE d3drs, - LPDWORD lprstate) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%d,%p): stub\n", This, d3drs, lprstate); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_SetRenderState(LPDIRECT3DDEVICE2 iface, - D3DRENDERSTATETYPE dwRenderStateType, - DWORD dwRenderState) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; + D3DDPRIVATE(This); TRACE("(%p)->(%d,%ld)\n", This, dwRenderStateType, dwRenderState); @@ -757,24 +436,10 @@ static HRESULT WINAPI IDirect3DDevice2Impl_SetRenderState(LPDIRECT3DDEVICE2 ifac return DD_OK; } - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetLightState(LPDIRECT3DDEVICE2 iface, - D3DLIGHTSTATETYPE d3dls, - LPDWORD lplstate) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%d,%p): stub\n", This, d3dls, lplstate); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_SetLightState(LPDIRECT3DDEVICE2 iface, - D3DLIGHTSTATETYPE dwLightStateType, - DWORD dwLightState) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_SetLightState( + LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE dwLightStateType, + DWORD dwLightState +) { ICOM_THIS(IDirect3DDevice2Impl,iface); FIXME("(%p)->(%d,%08lx): stub\n", This, dwLightStateType, dwLightState); @@ -802,22 +467,14 @@ static HRESULT WINAPI IDirect3DDevice2Impl_SetLightState(LPDIRECT3DDEVICE2 iface glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (float *) light); LEAVE_GL(); } break; - - case D3DLIGHTSTATE_COLORMODEL: /* 3 */ - break; - - case D3DLIGHTSTATE_FOGMODE: /* 4 */ - break; - - case D3DLIGHTSTATE_FOGSTART: /* 5 */ - break; - - case D3DLIGHTSTATE_FOGEND: /* 6 */ - break; - - case D3DLIGHTSTATE_FOGDENSITY: /* 7 */ - break; - + +#define UNSUP(x) case D3DLIGHTSTATE_##x: FIXME("unsupported D3DLIGHTSTATE_" #x "!\n");break; + UNSUP(COLORMODEL); + UNSUP(FOGMODE); + UNSUP(FOGSTART); + UNSUP(FOGEND); + UNSUP(FOGDENSITY); +#undef UNSUP default: TRACE("Unexpected Light State Type\n"); return DDERR_INVALIDPARAMS; @@ -826,14 +483,12 @@ static HRESULT WINAPI IDirect3DDevice2Impl_SetLightState(LPDIRECT3DDEVICE2 iface return DD_OK; } - - -static HRESULT WINAPI IDirect3DDevice2Impl_SetTransform(LPDIRECT3DDEVICE2 iface, - D3DTRANSFORMSTATETYPE d3dts, - LPD3DMATRIX lpmatrix) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_SetTransform( + LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, + LPD3DMATRIX lpmatrix +) { ICOM_THIS(IDirect3DDevice2Impl,iface); - OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; + D3DDPRIVATE(This); FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix); @@ -894,206 +549,177 @@ static HRESULT WINAPI IDirect3DDevice2Impl_SetTransform(LPDIRECT3DDEVICE2 iface, default: break; } - LEAVE_GL(); - return DD_OK; } - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetTransform(LPDIRECT3DDEVICE2 iface, - D3DTRANSFORMSTATETYPE d3dts, - LPD3DMATRIX lpmatrix) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_MultiplyTransform(LPDIRECT3DDEVICE2 iface, - D3DTRANSFORMSTATETYPE d3dts, - LPD3DMATRIX lpmatrix) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix); - - return DD_OK; -} - -#define DRAW_PRIMITIVE(MAXVERT,INDEX) \ - /* Puts GL in the correct lighting mode */ \ - if (odev->vt != d3dv) { \ - if (odev->vt == D3DVT_TLVERTEX) { \ - /* Need to put the correct transformation again */ \ - glMatrixMode(GL_MODELVIEW); \ - glLoadMatrixf((float *) &(odev->world_mat)); \ - glMatrixMode(GL_PROJECTION); \ - glLoadMatrixf((float *) &(odev->proj_mat)); \ - glMultMatrixf((float *) &(odev->view_mat)); \ - } \ - \ - switch (d3dv) { \ - case D3DVT_VERTEX: \ +#define DRAW_PRIMITIVE(MAXVERT,INDEX) \ + /* Puts GL in the correct lighting mode */ \ + if (odev->vt != d3dv) { \ + if (odev->vt == D3DVT_TLVERTEX) { \ + /* Need to put the correct transformation again */ \ + glMatrixMode(GL_MODELVIEW); \ + glLoadMatrixf((float *) &(odev->world_mat)); \ + glMatrixMode(GL_PROJECTION); \ + glLoadMatrixf((float *) &(odev->proj_mat)); \ + glMultMatrixf((float *) &(odev->view_mat)); \ + } \ + \ + switch (d3dv) { \ + case D3DVT_VERTEX: \ TRACE("Standard Vertex\n"); \ - glEnable(GL_LIGHTING); \ - break; \ - \ - case D3DVT_LVERTEX: \ - TRACE("Lighted Vertex\n"); \ - glDisable(GL_LIGHTING); \ - break; \ - \ - case D3DVT_TLVERTEX: { \ - GLdouble height, width, minZ, maxZ; \ - \ + glEnable(GL_LIGHTING); \ + break; \ + \ + case D3DVT_LVERTEX: \ + TRACE("Lighted Vertex\n"); \ + glDisable(GL_LIGHTING); \ + break; \ + \ + case D3DVT_TLVERTEX: { \ + GLdouble height, width, minZ, maxZ; \ + \ TRACE("Transformed - Lighted Vertex\n"); \ - /* First, disable lighting */ \ - glDisable(GL_LIGHTING); \ - \ - /* Then do not put any transformation matrixes */ \ - glMatrixMode(GL_MODELVIEW); \ - glLoadIdentity(); \ - glMatrixMode(GL_PROJECTION); \ - glLoadIdentity(); \ - \ - if (This->current_viewport == NULL) { \ + /* First, disable lighting */ \ + glDisable(GL_LIGHTING); \ + \ + /* Then do not put any transformation matrixes */ \ + glMatrixMode(GL_MODELVIEW); \ + glLoadIdentity(); \ + glMatrixMode(GL_PROJECTION); \ + glLoadIdentity(); \ + \ + if (This->current_viewport == NULL) { \ ERR("No current viewport !\n"); \ - /* Using standard values */ \ - height = 640.0; \ - width = 480.0; \ - minZ = -10.0; \ - maxZ = 10.0; \ - } else { \ - if (This->current_viewport->use_vp2) { \ - height = (GLdouble) This->current_viewport->viewport.vp2.dwHeight; \ - width = (GLdouble) This->current_viewport->viewport.vp2.dwWidth; \ - minZ = (GLdouble) This->current_viewport->viewport.vp2.dvMinZ; \ - maxZ = (GLdouble) This->current_viewport->viewport.vp2.dvMaxZ; \ - } else { \ - height = (GLdouble) This->current_viewport->viewport.vp1.dwHeight; \ - width = (GLdouble) This->current_viewport->viewport.vp1.dwWidth; \ - minZ = (GLdouble) This->current_viewport->viewport.vp1.dvMinZ; \ - maxZ = (GLdouble) This->current_viewport->viewport.vp1.dvMaxZ; \ - } \ - } \ - \ - glOrtho(0.0, width, height, 0.0, -minZ, -maxZ); \ - } break; \ - \ - default: \ + /* Using standard values */ \ + height = 640.0; \ + width = 480.0; \ + minZ = -10.0; \ + maxZ = 10.0; \ + } else { \ + if (This->current_viewport->use_vp2) { \ + height = (GLdouble) This->current_viewport->viewport.vp2.dwHeight;\ + width = (GLdouble) This->current_viewport->viewport.vp2.dwWidth;\ + minZ = (GLdouble) This->current_viewport->viewport.vp2.dvMinZ;\ + maxZ = (GLdouble) This->current_viewport->viewport.vp2.dvMaxZ;\ + } else { \ + height = (GLdouble) This->current_viewport->viewport.vp1.dwHeight;\ + width = (GLdouble) This->current_viewport->viewport.vp1.dwWidth;\ + minZ = (GLdouble) This->current_viewport->viewport.vp1.dvMinZ;\ + maxZ = (GLdouble) This->current_viewport->viewport.vp1.dvMaxZ;\ + } \ + } \ + \ + glOrtho(0.0, width, height, 0.0, -minZ, -maxZ); \ + } break; \ + \ + default: \ ERR("Unhandled vertex type\n"); \ - break; \ - } \ - \ - odev->vt = d3dv; \ - } \ - \ - switch (d3dp) { \ - case D3DPT_POINTLIST: \ + break; \ + } \ + \ + odev->vt = d3dv; \ + } \ + \ + switch (d3dp) { \ + case D3DPT_POINTLIST: \ TRACE("Start POINTS\n"); \ - glBegin(GL_POINTS); \ - break; \ - \ - case D3DPT_LINELIST: \ + glBegin(GL_POINTS); \ + break; \ + \ + case D3DPT_LINELIST: \ TRACE("Start LINES\n"); \ - glBegin(GL_LINES); \ - break; \ - \ - case D3DPT_LINESTRIP: \ - TRACE("Start LINE_STRIP\n"); \ - glBegin(GL_LINE_STRIP); \ - break; \ - \ - case D3DPT_TRIANGLELIST: \ + glBegin(GL_LINES); \ + break; \ + \ + case D3DPT_LINESTRIP: \ + TRACE("Start LINE_STRIP\n"); \ + glBegin(GL_LINE_STRIP); \ + break; \ + \ + case D3DPT_TRIANGLELIST: \ TRACE("Start TRIANGLES\n"); \ - glBegin(GL_TRIANGLES); \ - break; \ - \ - case D3DPT_TRIANGLESTRIP: \ + glBegin(GL_TRIANGLES); \ + break; \ + \ + case D3DPT_TRIANGLESTRIP: \ TRACE("Start TRIANGLE_STRIP\n"); \ - glBegin(GL_TRIANGLE_STRIP); \ - break; \ - \ - case D3DPT_TRIANGLEFAN: \ + glBegin(GL_TRIANGLE_STRIP); \ + break; \ + \ + case D3DPT_TRIANGLEFAN: \ TRACE("Start TRIANGLE_FAN\n"); \ - glBegin(GL_TRIANGLE_FAN); \ - break; \ - \ - default: \ + glBegin(GL_TRIANGLE_FAN); \ + break; \ + \ + default: \ TRACE("Unhandled primitive\n"); \ - break; \ - } \ - \ - /* Draw the primitives */ \ - for (vx_index = 0; vx_index < MAXVERT; vx_index++) { \ - switch (d3dv) { \ - case D3DVT_VERTEX: { \ - D3DVERTEX *vx = ((D3DVERTEX *) lpvertex) + INDEX; \ - \ - glNormal3f(vx->nx.nx, vx->ny.ny, vx->nz.nz); \ - glVertex3f(vx->x.x, vx->y.y, vx->z.z); \ + break; \ + } \ + \ + /* Draw the primitives */ \ + for (vx_index = 0; vx_index < MAXVERT; vx_index++) { \ + switch (d3dv) { \ + case D3DVT_VERTEX: { \ + D3DVERTEX *vx = ((D3DVERTEX *) lpvertex) + INDEX; \ + \ + glNormal3f(vx->nx.nx, vx->ny.ny, vx->nz.nz); \ + glVertex3f(vx->x.x, vx->y.y, vx->z.z); \ TRACE(" V: %f %f %f\n", vx->x.x, vx->y.y, vx->z.z); \ - } break; \ - \ - case D3DVT_LVERTEX: { \ - D3DLVERTEX *vx = ((D3DLVERTEX *) lpvertex) + INDEX; \ - DWORD col = vx->c.color; \ - \ - glColor3f(((col >> 16) & 0xFF) / 255.0, \ - ((col >> 8) & 0xFF) / 255.0, \ - ((col >> 0) & 0xFF) / 255.0); \ - glVertex3f(vx->x.x, vx->y.y, vx->z.z); \ + } break; \ + \ + case D3DVT_LVERTEX: { \ + D3DLVERTEX *vx = ((D3DLVERTEX *) lpvertex) + INDEX; \ + DWORD col = vx->c.color; \ + \ + glColor3f(((col >> 16) & 0xFF) / 255.0, \ + ((col >> 8) & 0xFF) / 255.0, \ + ((col >> 0) & 0xFF) / 255.0); \ + glVertex3f(vx->x.x, vx->y.y, vx->z.z); \ TRACE(" LV: %f %f %f (%02lx %02lx %02lx)\n", \ - vx->x.x, vx->y.y, vx->z.z, \ - ((col >> 16) & 0xFF), ((col >> 8) & 0xFF), ((col >> 0) & 0xFF)); \ - } break; \ - \ - case D3DVT_TLVERTEX: { \ - D3DTLVERTEX *vx = ((D3DTLVERTEX *) lpvertex) + INDEX; \ - DWORD col = vx->c.color; \ - \ - glColor3f(((col >> 16) & 0xFF) / 255.0, \ - ((col >> 8) & 0xFF) / 255.0, \ - ((col >> 0) & 0xFF) / 255.0); \ - glTexCoord2f(vx->u.tu, vx->v.tv); \ - if (vx->r.rhw < 0.01) \ - glVertex3f(vx->x.sx, \ - vx->y.sy, \ - vx->z.sz); \ - else \ - glVertex4f(vx->x.sx / vx->r.rhw, \ - vx->y.sy / vx->r.rhw, \ - vx->z.sz / vx->r.rhw, \ - 1.0 / vx->r.rhw); \ - TRACE(" TLV: %f %f %f (%02lx %02lx %02lx) (%f %f) (%f)\n", \ - vx->x.sx, vx->y.sy, vx->z.sz, \ - ((col >> 16) & 0xFF), ((col >> 8) & 0xFF), ((col >> 0) & 0xFF), \ - vx->u.tu, vx->v.tv, vx->r.rhw); \ - } break; \ - \ - default: \ - TRACE("Unhandled vertex type\n"); \ - break; \ - } \ - } \ - \ - glEnd(); \ + vx->x.x, vx->y.y, vx->z.z, \ + ((col >> 16) & 0xFF), ((col >> 8) & 0xFF), ((col >> 0) & 0xFF));\ + } break; \ + \ + case D3DVT_TLVERTEX: { \ + D3DTLVERTEX *vx = ((D3DTLVERTEX *) lpvertex) + INDEX; \ + DWORD col = vx->c.color; \ + \ + glColor3f(((col >> 16) & 0xFF) / 255.0, \ + ((col >> 8) & 0xFF) / 255.0, \ + ((col >> 0) & 0xFF) / 255.0); \ + glTexCoord2f(vx->u.tu, vx->v.tv); \ + if (vx->r.rhw < 0.01) \ + glVertex3f(vx->x.sx, \ + vx->y.sy, \ + vx->z.sz); \ + else \ + glVertex4f(vx->x.sx / vx->r.rhw, \ + vx->y.sy / vx->r.rhw, \ + vx->z.sz / vx->r.rhw, \ + 1.0 / vx->r.rhw); \ + TRACE(" TLV: %f %f %f (%02lx %02lx %02lx) (%f %f) (%f)\n", \ + vx->x.sx, vx->y.sy, vx->z.sz, \ + ((col >> 16) & 0xFF), ((col >> 8) & 0xFF), ((col >> 0) & 0xFF),\ + vx->u.tu, vx->v.tv, vx->r.rhw); \ + } break; \ + \ + default: \ + FIXME("Unhandled vertex type\n"); \ + break; \ + } \ + } \ + \ + glEnd(); \ TRACE("End\n"); -static HRESULT WINAPI IDirect3DDevice2Impl_DrawPrimitive(LPDIRECT3DDEVICE2 iface, - D3DPRIMITIVETYPE d3dp, - D3DVERTEXTYPE d3dv, - LPVOID lpvertex, - DWORD vertcount, - DWORD dwFlags) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_DrawPrimitive( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvertex, DWORD vertcount, DWORD dwFlags +) { ICOM_THIS(IDirect3DDevice2Impl,iface); - OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; + D3DDPRIVATE(This); int vx_index; TRACE("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, dwFlags); @@ -1103,21 +729,15 @@ static HRESULT WINAPI IDirect3DDevice2Impl_DrawPrimitive(LPDIRECT3DDEVICE2 iface LEAVE_GL(); return D3D_OK; - } - - +} -static HRESULT WINAPI IDirect3DDevice2Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE2 iface, - D3DPRIMITIVETYPE d3dp, - D3DVERTEXTYPE d3dv, - LPVOID lpvertex, - DWORD vertcount, - LPWORD lpindexes, - DWORD indexcount, - DWORD dwFlags) -{ +static HRESULT WINAPI MESA_IDirect3DDevice2Impl_DrawIndexedPrimitive( + LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv, + LPVOID lpvertex, DWORD vertcount, LPWORD lpindexes, DWORD indexcount, + DWORD dwFlags +) { ICOM_THIS(IDirect3DDevice2Impl,iface); - OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; + D3DDPRIVATE(This); int vx_index; TRACE("(%p)->(%d,%d,%p,%ld,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, lpindexes, indexcount, dwFlags); @@ -1129,30 +749,6 @@ static HRESULT WINAPI IDirect3DDevice2Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE return D3D_OK; } - - -static HRESULT WINAPI IDirect3DDevice2Impl_SetClipStatus(LPDIRECT3DDEVICE2 iface, - LPD3DCLIPSTATUS lpcs) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p): stub\n", This, lpcs); - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDevice2Impl_GetClipStatus(LPDIRECT3DDEVICE2 iface, - LPD3DCLIPSTATUS lpcs) -{ - ICOM_THIS(IDirect3DDevice2Impl,iface); - FIXME("(%p)->(%p): stub\n", This, lpcs); - - return DD_OK; -} - - - /******************************************************************************* * OpenGL-specific IDirect3DDevice2 */ @@ -1161,22 +757,22 @@ static HRESULT WINAPI IDirect3DDevice2Impl_GetClipStatus(LPDIRECT3DDEVICE2 iface * OpenGL-specific VTable */ -static ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable = +ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirect3DDevice2Impl_QueryInterface, IDirect3DDevice2Impl_AddRef, - IDirect3DDevice2Impl_Release, + MESA_IDirect3DDevice2Impl_Release, /*** IDirect3DDevice2 methods ***/ - IDirect3DDevice2Impl_GetCaps, + MESA_IDirect3DDevice2Impl_GetCaps, IDirect3DDevice2Impl_SwapTextureHandles, IDirect3DDevice2Impl_GetStats, IDirect3DDevice2Impl_AddViewport, IDirect3DDevice2Impl_DeleteViewport, IDirect3DDevice2Impl_NextViewport, - IDirect3DDevice2Impl_EnumTextureFormats, - IDirect3DDevice2Impl_BeginScene, - IDirect3DDevice2Impl_EndScene, + MESA_IDirect3DDevice2Impl_EnumTextureFormats, + MESA_IDirect3DDevice2Impl_BeginScene, + MESA_IDirect3DDevice2Impl_EndScene, IDirect3DDevice2Impl_GetDirect3D, /*** DrawPrimitive API ***/ @@ -1193,15 +789,15 @@ static ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable = IDirect3DDevice2Impl_End, IDirect3DDevice2Impl_GetRenderState, - IDirect3DDevice2Impl_SetRenderState, + MESA_IDirect3DDevice2Impl_SetRenderState, IDirect3DDevice2Impl_GetLightState, - IDirect3DDevice2Impl_SetLightState, - IDirect3DDevice2Impl_SetTransform, + MESA_IDirect3DDevice2Impl_SetLightState, + MESA_IDirect3DDevice2Impl_SetTransform, IDirect3DDevice2Impl_GetTransform, IDirect3DDevice2Impl_MultiplyTransform, - IDirect3DDevice2Impl_DrawPrimitive, - IDirect3DDevice2Impl_DrawIndexedPrimitive, + MESA_IDirect3DDevice2Impl_DrawPrimitive, + MESA_IDirect3DDevice2Impl_DrawIndexedPrimitive, IDirect3DDevice2Impl_SetClipStatus, IDirect3DDevice2Impl_GetClipStatus, @@ -1230,14 +826,15 @@ float id_mat[16] = { int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device) { if (!memcmp(&IID_D3DDEVICE_OpenGL,rguid,sizeof(IID_D3DDEVICE_OpenGL))) { - OpenGL_IDirect3DDevice *odev; + mesa_d3dd_private *odev; #ifndef USE_OSMESA int attributeList[]={ GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None }; XVisualInfo *xvis; #endif - *device = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(OpenGL_IDirect3DDevice)); - odev = (OpenGL_IDirect3DDevice *) (*device); + *device = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DDeviceImpl)); + (*device)->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dd_private)); + odev = (mesa_d3dd_private*)(*device)->private; (*device)->ref = 1; ICOM_VTBL(*device) = &OpenGL_vtable_dx3; (*device)->d3d = NULL; @@ -1246,7 +843,7 @@ int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevi (*device)->viewport_list = NULL; (*device)->current_viewport = NULL; - (*device)->set_context = set_context_dx3; + (*device)->set_context = (void*)set_context; TRACE("OpenGL device created \n"); @@ -1274,6 +871,7 @@ int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevi GL_TRUE); TRACE("Context created\n"); +#if 0 /* non working currently */ /* Now override the surface's Flip method (if in double buffering) */ surface->s.d3d_device = (void *) odev; { @@ -1283,6 +881,7 @@ int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevi if (chain->surfaces[i]->s.surface_desc.ddsCaps.dwCaps & DDSCAPS_FLIP) chain->surfaces[i]->s.d3d_device = (void *) odev; } +#endif #endif odev->rs.src = GL_ONE; odev->rs.dst = GL_ZERO; @@ -1305,239 +904,30 @@ int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevi return DD_OK; } - -/******************************************************************************* - * Direct3DDevice - */ -static HRESULT WINAPI IDirect3DDeviceImpl_QueryInterface(LPDIRECT3DDEVICE iface, - REFIID riid, - LPVOID* ppvObj) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - - FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj); - - return S_OK; -} - - - -static ULONG WINAPI IDirect3DDeviceImpl_AddRef(LPDIRECT3DDEVICE iface) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->()incrementing from %lu.\n", This, This->ref ); - - return ++(This->ref); -} - - - -static ULONG WINAPI IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface) +static ULONG WINAPI MESA_IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface) { ICOM_THIS(IDirect3DDeviceImpl,iface); FIXME("(%p)->() decrementing from %lu.\n", This, This->ref ); if (!--(This->ref)) { - OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This; - + D3DDPRIVATE(This); #ifdef USE_OSMESA OSMesaDestroyContext(odev->ctx); #else ENTER_GL(); - glXDestroyContext(display, - odev->ctx); + glXDestroyContext(display, odev->ctx); LEAVE_GL(); #endif - + This->private = NULL; HeapFree(GetProcessHeap(),0,This); return 0; } - return This->ref; } -static HRESULT WINAPI IDirect3DDeviceImpl_Initialize(LPDIRECT3DDEVICE iface, - LPDIRECT3D lpd3d, - LPGUID lpGUID, - LPD3DDEVICEDESC lpd3ddvdesc) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p,%p,%p): stub\n", This, lpd3d,lpGUID, lpd3ddvdesc); - - return DDERR_ALREADYINITIALIZED; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_GetCaps(LPDIRECT3DDEVICE iface, - LPD3DDEVICEDESC lpD3DHWDevDesc, - LPD3DDEVICEDESC lpD3DSWDevDesc) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpD3DHWDevDesc, lpD3DSWDevDesc); - - fill_opengl_caps(lpD3DHWDevDesc, lpD3DSWDevDesc); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_SwapTextureHandles(LPDIRECT3DDEVICE iface, - LPDIRECT3DTEXTURE lpD3DTex1, - LPDIRECT3DTEXTURE lpD3DTex2) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpD3DTex1, lpD3DTex2); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3DDeviceImpl_CreateExecuteBuffer(LPDIRECT3DDEVICE iface, - LPD3DEXECUTEBUFFERDESC lpDesc, - LPDIRECT3DEXECUTEBUFFER *lplpDirect3DExecuteBuffer, - IUnknown *pUnkOuter) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p,%p,%p)\n", This, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter); - - *lplpDirect3DExecuteBuffer = d3dexecutebuffer_create(This, lpDesc); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_GetStats(LPDIRECT3DDEVICE iface, - LPD3DSTATS lpD3DStats) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p): stub\n", This, lpD3DStats); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_Execute(LPDIRECT3DDEVICE iface, - LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, - LPDIRECT3DVIEWPORT lpDirect3DViewport, - DWORD dwFlags) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p,%p,%08ld): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags); - - /* Put this as the default context */ - - /* Execute... */ - ((IDirect3DExecuteBufferImpl*)lpDirect3DExecuteBuffer)->execute(lpDirect3DExecuteBuffer, iface, lpDirect3DViewport); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3DDeviceImpl_AddViewport(LPDIRECT3DDEVICE iface, - LPDIRECT3DVIEWPORT lpvp) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; - FIXME("(%p)->(%p): stub\n", This, ilpvp); - - /* Adds this viewport to the viewport list */ - ilpvp->next = This->viewport_list; - This->viewport_list = ilpvp; - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDeviceImpl_DeleteViewport(LPDIRECT3DDEVICE iface, - LPDIRECT3DVIEWPORT lpvp) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; - IDirect3DViewport2Impl *cur, *prev; - FIXME("(%p)->(%p): stub\n", This, lpvp); - - /* Finds this viewport in the list */ - prev = NULL; - cur = This->viewport_list; - while ((cur != NULL) && (cur != ilpvp)) { - prev = cur; - cur = cur->next; - } - if (cur == NULL) - return DDERR_INVALIDOBJECT; - - /* And remove it */ - if (prev == NULL) - This->viewport_list = cur->next; - else - prev->next = cur->next; - - return DD_OK; -} - - - -static HRESULT WINAPI IDirect3DDeviceImpl_NextViewport(LPDIRECT3DDEVICE iface, - LPDIRECT3DVIEWPORT lpvp, - LPDIRECT3DVIEWPORT* lplpvp, - DWORD dwFlags) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp; - IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp; - FIXME("(%p)->(%p,%p,%08lx): stub\n", This, ilpvp, ilplpvp, dwFlags); - - switch (dwFlags) { - case D3DNEXT_NEXT: - *ilplpvp = ilpvp->next; - break; - - case D3DNEXT_HEAD: - *ilplpvp = This->viewport_list; - break; - - case D3DNEXT_TAIL: - ilpvp = This->viewport_list; - while (ilpvp->next != NULL) - ilpvp = ilpvp->next; - - *ilplpvp = ilpvp; - break; - - default: - return DDERR_INVALIDPARAMS; - } - - return DD_OK; -} - -static HRESULT WINAPI IDirect3DDeviceImpl_Pick(LPDIRECT3DDEVICE iface, - LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer, - LPDIRECT3DVIEWPORT lpDirect3DViewport, - DWORD dwFlags, - LPD3DRECT lpRect) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p,%p,%08lx,%p): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, - dwFlags, lpRect); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_GetPickRecords(LPDIRECT3DDEVICE iface, - LPDWORD lpCount, - LPD3DPICKRECORD lpD3DPickRec) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpCount, lpD3DPickRec); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_EnumTextureFormats(LPDIRECT3DDEVICE iface, - LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc, - LPVOID lpArg) +static HRESULT WINAPI MESA_IDirect3DDeviceImpl_EnumTextureFormats( + LPDIRECT3DDEVICE iface,LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc, + LPVOID lpArg) { ICOM_THIS(IDirect3DDeviceImpl,iface); TRACE("(%p)->(%p,%p): stub\n", This, lpd3dEnumTextureProc, lpArg); @@ -1546,59 +936,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_EnumTextureFormats(LPDIRECT3DDEVICE if } -static HRESULT WINAPI IDirect3DDeviceImpl_CreateMatrix(LPDIRECT3DDEVICE iface, - LPD3DMATRIXHANDLE lpD3DMatHandle) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p)\n", This, lpD3DMatHandle); - - *lpD3DMatHandle = (D3DMATRIXHANDLE) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(D3DMATRIX)); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_SetMatrix(LPDIRECT3DDEVICE iface, - D3DMATRIXHANDLE d3dMatHandle, - const LPD3DMATRIX lpD3DMatrix) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%08lx,%p)\n", This, d3dMatHandle, lpD3DMatrix); - - dump_mat(lpD3DMatrix); - - *((D3DMATRIX *) d3dMatHandle) = *lpD3DMatrix; - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_GetMatrix(LPDIRECT3DDEVICE iface, - D3DMATRIXHANDLE D3DMatHandle, - LPD3DMATRIX lpD3DMatrix) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%08lx,%p)\n", This, D3DMatHandle, lpD3DMatrix); - - *lpD3DMatrix = *((D3DMATRIX *) D3DMatHandle); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_DeleteMatrix(LPDIRECT3DDEVICE iface, - D3DMATRIXHANDLE d3dMatHandle) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%08lx)\n", This, d3dMatHandle); - - HeapFree(GetProcessHeap(),0, (void *) d3dMatHandle); - - return DD_OK; -} - - -static HRESULT WINAPI IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface) +static HRESULT WINAPI MESA_IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface) { ICOM_THIS(IDirect3DDeviceImpl,iface); /* OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This; */ @@ -1614,11 +952,11 @@ static HRESULT WINAPI IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface) /* This is for the moment copy-pasted from IDirect3DDevice2... Will make a common function ... */ -static HRESULT WINAPI IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface) +static HRESULT WINAPI MESA_IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface) { ICOM_THIS(IDirect3DDeviceImpl,iface); #ifdef USE_OSMESA - OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This; + D3DDPRIVATE(This); LPDIRECTDRAWSURFACE3 surf = (LPDIRECTDRAWSURFACE3) This->surface; DDSURFACEDESC sdesc; int x,y; @@ -1667,27 +1005,15 @@ static HRESULT WINAPI IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface) return DD_OK; } - -static HRESULT WINAPI IDirect3DDeviceImpl_GetDirect3D(LPDIRECT3DDEVICE iface, - LPDIRECT3D *lpDirect3D) -{ - ICOM_THIS(IDirect3DDeviceImpl,iface); - TRACE("(%p)->(%p): stub\n", This, lpDirect3D); - - return DD_OK; -} - - - /******************************************************************************* * Direct3DDevice VTable */ -static ICOM_VTABLE(IDirect3DDevice) OpenGL_vtable_dx3 = +ICOM_VTABLE(IDirect3DDevice) OpenGL_vtable_dx3 = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE IDirect3DDeviceImpl_QueryInterface, IDirect3DDeviceImpl_AddRef, - IDirect3DDeviceImpl_Release, + MESA_IDirect3DDeviceImpl_Release, IDirect3DDeviceImpl_Initialize, IDirect3DDeviceImpl_GetCaps, IDirect3DDeviceImpl_SwapTextureHandles, @@ -1699,34 +1025,12 @@ static ICOM_VTABLE(IDirect3DDevice) OpenGL_vtable_dx3 = IDirect3DDeviceImpl_NextViewport, IDirect3DDeviceImpl_Pick, IDirect3DDeviceImpl_GetPickRecords, - IDirect3DDeviceImpl_EnumTextureFormats, + MESA_IDirect3DDeviceImpl_EnumTextureFormats, IDirect3DDeviceImpl_CreateMatrix, IDirect3DDeviceImpl_SetMatrix, IDirect3DDeviceImpl_GetMatrix, IDirect3DDeviceImpl_DeleteMatrix, - IDirect3DDeviceImpl_BeginScene, - IDirect3DDeviceImpl_EndScene, + MESA_IDirect3DDeviceImpl_BeginScene, + MESA_IDirect3DDeviceImpl_EndScene, IDirect3DDeviceImpl_GetDirect3D, }; - -#else /* HAVE_MESAGL */ - -int d3d_OpenGL(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) { - return 0; -} - -int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d) -{ - return 0; -} - -int d3d_OpenGL_dx3(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) { - return 0; -} - -int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device) -{ - return 0; -} - -#endif /* HAVE_MESAGL */ diff --git a/dlls/ddraw/d3dexecutebuffer.c b/dlls/ddraw/d3dexecutebuffer.c index 1a7eb5a5688..bca7dbed356 100644 --- a/dlls/ddraw/d3dexecutebuffer.c +++ b/dlls/ddraw/d3dexecutebuffer.c @@ -14,12 +14,12 @@ #include "d3d.h" #include "debugtools.h" -#include "d3d_private.h" +#include "mesa_private.h" + +#define D3DDPRIVATE(x) mesa_d3dd_private *odev=((mesa_d3dd_private*)(x)->private) DEFAULT_DEBUG_CHANNEL(ddraw) -#ifdef HAVE_MESAGL - /* Structure to store the 'semi transformed' vertices */ typedef struct { D3DVALUE x; @@ -180,7 +180,7 @@ static void execute(LPDIRECT3DEXECUTEBUFFER lpBuff, /* DWORD il = ilpBuff->data.dwInstructionLength; */ void *instr = ilpBuff->desc.lpData + is; - OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) dev; + D3DDPRIVATE((IDirect3DDeviceImpl*)dev); TRACE("ExecuteData : \n"); if (TRACE_ON(ddraw)) @@ -857,5 +857,3 @@ static ICOM_VTABLE(IDirect3DExecuteBuffer) executebuffer_vtable = IDirect3DExecuteBufferImpl_Validate, IDirect3DExecuteBufferImpl_Optimize }; - -#endif /* HAVE_MESAGL */ diff --git a/dlls/ddraw/d3dlight.c b/dlls/ddraw/d3dlight.c index 0b378b97226..71d597b632a 100644 --- a/dlls/ddraw/d3dlight.c +++ b/dlls/ddraw/d3dlight.c @@ -13,11 +13,11 @@ #include "d3d.h" #include "debugtools.h" -#include "d3d_private.h" +#include "mesa_private.h" DEFAULT_DEBUG_CHANNEL(ddraw) - -#ifdef HAVE_MESAGL + +#define D3DLPRIVATE(x) mesa_d3dl_private*dlpriv=((mesa_d3dl_private*)x->private) static ICOM_VTABLE(IDirect3DLight) light_vtable; @@ -34,6 +34,7 @@ static const float zero_value[] = { }; static void update(IDirect3DLightImpl* This) { + D3DLPRIVATE(This); switch (This->light.dltType) { case D3DLIGHT_POINT: /* 1 */ TRACE("Activating POINT\n"); @@ -53,21 +54,15 @@ static void update(IDirect3DLightImpl* This) { This->light.dvDirection.z.z); _dump_colorvalue(" color ", This->light.dcvColor); - glLightfv(This->light_num, - GL_AMBIENT, - (float *) zero_value); - - glLightfv(This->light_num, - GL_DIFFUSE, - (float *) &(This->light.dcvColor)); + glLightfv(dlpriv->light_num, GL_AMBIENT, (float *) zero_value); + glLightfv(dlpriv->light_num, GL_DIFFUSE, (float *) &(This->light.dcvColor)); direction[0] = -This->light.dvDirection.x.x; direction[1] = -This->light.dvDirection.y.y; direction[2] = -This->light.dvDirection.z.z; direction[3] = 0.0; /* This is a directional light */ - glLightfv(This->light_num, - GL_POSITION, - (float *) direction); + + glLightfv(dlpriv->light_num, GL_POSITION, (float *) direction); } break; case D3DLIGHT_PARALLELPOINT: /* 4 */ @@ -75,19 +70,19 @@ static void update(IDirect3DLightImpl* This) { break; default: - TRACE("Not a know Light Type\n"); + TRACE("Not a known Light Type: %d\n",This->light.dltType); break; } } static void activate(IDirect3DLightImpl* This) { + D3DLPRIVATE(This); + ENTER_GL(); update(This); - /* If was not active, activate it */ if (This->is_active == 0) { - glEnable(This->light_num); - + glEnable(dlpriv->light_num); This->is_active = 1; } LEAVE_GL(); @@ -254,18 +249,3 @@ static ICOM_VTABLE(IDirect3DLight) light_vtable = IDirect3DLightImpl_SetLight, IDirect3DLightImpl_GetLight }; - -#else /* HAVE_MESAGL */ - -/* These function should never be called if MesaGL is not present */ -LPDIRECT3DLIGHT d3dlight_create_dx3(IDirect3DImpl* d3d1) { - ERR("Should not be called...\n"); - return NULL; -} - -LPDIRECT3DLIGHT d3dlight_create(IDirect3D2Impl* d3d2) { - ERR("Should not be called...\n"); - return NULL; -} - -#endif /* HAVE_MESAGL */ diff --git a/dlls/ddraw/d3dmaterial.c b/dlls/ddraw/d3dmaterial.c index 911619cc820..d025efd1960 100644 --- a/dlls/ddraw/d3dmaterial.c +++ b/dlls/ddraw/d3dmaterial.c @@ -12,12 +12,10 @@ #include "d3d.h" #include "debugtools.h" -#include "d3d_private.h" +#include "mesa_private.h" DEFAULT_DEBUG_CHANNEL(ddraw) -#ifdef HAVE_MESAGL - static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable; static ICOM_VTABLE(IDirect3DMaterial) material_vtable; @@ -250,18 +248,3 @@ static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable = IDirect3DMaterial2Impl_GetMaterial, IDirect3DMaterial2Impl_GetHandle }; - -#else /* HAVE_MESAGL */ - -LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1) { - ERR("Should not be called...\n"); - return NULL; -} - -LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2) { - ERR("Should not be called...\n"); - return NULL; -} - - -#endif /* HAVE_MESAGL */ diff --git a/dlls/ddraw/d3dtexture.c b/dlls/ddraw/d3dtexture.c index 34ff0aeda1e..b05570c045b 100644 --- a/dlls/ddraw/d3dtexture.c +++ b/dlls/ddraw/d3dtexture.c @@ -14,12 +14,13 @@ #include "d3d.h" #include "debugtools.h" -#include "d3d_private.h" +#include "mesa_private.h" + +#define D3DDPRIVATE(x) mesa_d3dd_private*odev=(mesa_d3dd_private*)(x)->private +#define D3DTPRIVATE(x) mesa_d3dt_private*dtpriv=(mesa_d3dt_private*)(x)->private DEFAULT_DEBUG_CHANNEL(ddraw) -#ifdef HAVE_MESAGL - /* Define this if you want to save to a file all the textures used by a game (can be funny to see how they managed to cram all the pictures in texture memory) */ @@ -34,7 +35,7 @@ DEFAULT_DEBUG_CHANNEL(ddraw) char buf[32]; \ int x, y; \ \ - sprintf(buf, "%ld.pnm", This->tex_name); \ + sprintf(buf, "%ld.pnm", dtpriv->tex_name); \ f = fopen(buf, "wb"); \ fprintf(f, "P6\n%ld %ld\n255\n", src_d->dwWidth, src_d->dwHeight); \ for (y = 0; y < src_d->dwHeight; y++) { \ @@ -54,7 +55,7 @@ DEFAULT_DEBUG_CHANNEL(ddraw) char buf[32]; \ int x, y; \ \ - sprintf(buf, "%ld.pnm", This->tex_name); \ + sprintf(buf, "%ld.pnm", dtpriv->tex_name); \ f = fopen(buf, "wb"); \ fprintf(f, "P6\n%ld %ld\n255\n", src_d->dwWidth, src_d->dwHeight); \ for (y = 0; y < src_d->dwHeight; y++) { \ @@ -74,7 +75,7 @@ DEFAULT_DEBUG_CHANNEL(ddraw) char buf[32]; \ int x, y; \ \ - sprintf(buf, "%ld.pnm", This->tex_name); \ + sprintf(buf, "%ld.pnm", dtpriv->tex_name); \ f = fopen(buf, "wb"); \ fprintf(f, "P6\n%ld %ld\n255\n", src_d->dwWidth, src_d->dwHeight); \ for (y = 0; y < src_d->dwHeight; y++) { \ @@ -132,6 +133,7 @@ LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf) HRESULT WINAPI SetColorKey_cb(IDirect3DTexture2Impl *texture, DWORD dwFlags, LPDDCOLORKEY ckey ) { DDSURFACEDESC *tex_d; + D3DTPRIVATE(texture); int bpp; GLuint current_texture; @@ -148,12 +150,12 @@ HRESULT WINAPI SetColorKey_cb(IDirect3DTexture2Impl *texture, DWORD dwFlags, LP glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); /* If the GetHandle was not done yet, it's an error */ - if (texture->tex_name == 0) { + if (dtpriv->tex_name == 0) { ERR("Unloaded texture !\n"); LEAVE_GL(); return DD_OK; } - glBindTexture(GL_TEXTURE_2D, texture->tex_name); + glBindTexture(GL_TEXTURE_2D, dtpriv->tex_name); if (tex_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { FIXME("Todo Paletted\n"); @@ -219,7 +221,7 @@ HRESULT WINAPI SetColorKey_cb(IDirect3DTexture2Impl *texture, DWORD dwFlags, LP * IDirect3DTexture2 methods */ -static HRESULT WINAPI IDirect3DTexture2Impl_QueryInterface(LPDIRECT3DTEXTURE2 iface, +HRESULT WINAPI IDirect3DTexture2Impl_QueryInterface(LPDIRECT3DTEXTURE2 iface, REFIID riid, LPVOID* ppvObj) { @@ -232,7 +234,7 @@ static HRESULT WINAPI IDirect3DTexture2Impl_QueryInterface(LPDIRECT3DTEXTURE2 if -static ULONG WINAPI IDirect3DTexture2Impl_AddRef(LPDIRECT3DTEXTURE2 iface) +ULONG WINAPI IDirect3DTexture2Impl_AddRef(LPDIRECT3DTEXTURE2 iface) { ICOM_THIS(IDirect3DTexture2Impl,iface); TRACE("(%p)->()incrementing from %lu.\n", This, This->ref ); @@ -242,15 +244,16 @@ static ULONG WINAPI IDirect3DTexture2Impl_AddRef(LPDIRECT3DTEXTURE2 iface) -static ULONG WINAPI IDirect3DTexture2Impl_Release(LPDIRECT3DTEXTURE2 iface) +ULONG WINAPI IDirect3DTexture2Impl_Release(LPDIRECT3DTEXTURE2 iface) { ICOM_THIS(IDirect3DTexture2Impl,iface); + D3DTPRIVATE(This); FIXME("(%p)->() decrementing from %lu.\n", This, This->ref ); if (!--(This->ref)) { /* Delete texture from OpenGL */ ENTER_GL(); - glDeleteTextures(1, &(This->tex_name)); + glDeleteTextures(1, &(dtpriv->tex_name)); LEAVE_GL(); /* Release surface */ @@ -264,30 +267,31 @@ static ULONG WINAPI IDirect3DTexture2Impl_Release(LPDIRECT3DTEXTURE2 iface) } /*** IDirect3DTexture methods ***/ -static HRESULT WINAPI IDirect3DTextureImpl_GetHandle(LPDIRECT3DTEXTURE iface, +HRESULT WINAPI IDirect3DTextureImpl_GetHandle(LPDIRECT3DTEXTURE iface, LPDIRECT3DDEVICE lpD3DDevice, LPD3DTEXTUREHANDLE lpHandle) { - ICOM_THIS(IDirect3DTexture2Impl,iface); - IDirect3DDeviceImpl* ilpD3DDevice=(IDirect3DDeviceImpl*)lpD3DDevice; - FIXME("(%p)->(%p,%p): stub\n", This, ilpD3DDevice, lpHandle); + ICOM_THIS(IDirect3DTexture2Impl,iface); + D3DTPRIVATE(This); + IDirect3DDeviceImpl* ilpD3DDevice=(IDirect3DDeviceImpl*)lpD3DDevice; + FIXME("(%p)->(%p,%p): stub\n", This, ilpD3DDevice, lpHandle); - *lpHandle = (D3DTEXTUREHANDLE) This; - - /* Now, bind a new texture */ - ENTER_GL(); - ilpD3DDevice->set_context(ilpD3DDevice); - This->D3Ddevice = (void *) ilpD3DDevice; - if (This->tex_name == 0) - glGenTextures(1, &(This->tex_name)); - LEAVE_GL(); + *lpHandle = (D3DTEXTUREHANDLE) This; - TRACE("OpenGL texture handle is : %ld\n", This->tex_name); - - return D3D_OK; + /* Now, bind a new texture */ + ENTER_GL(); + ilpD3DDevice->set_context(ilpD3DDevice); + This->D3Ddevice = (void *) ilpD3DDevice; + if (dtpriv->tex_name == 0) + glGenTextures(1, &(dtpriv->tex_name)); + LEAVE_GL(); + + TRACE("OpenGL texture handle is : %d\n", dtpriv->tex_name); + + return D3D_OK; } -static HRESULT WINAPI IDirect3DTextureImpl_Initialize(LPDIRECT3DTEXTURE iface, +HRESULT WINAPI IDirect3DTextureImpl_Initialize(LPDIRECT3DTEXTURE iface, LPDIRECT3DDEVICE lpD3DDevice, LPDIRECTDRAWSURFACE lpSurface) { @@ -297,7 +301,7 @@ static HRESULT WINAPI IDirect3DTextureImpl_Initialize(LPDIRECT3DTEXTURE iface, return DDERR_ALREADYINITIALIZED; } -static HRESULT WINAPI IDirect3DTextureImpl_Unload(LPDIRECT3DTEXTURE iface) +HRESULT WINAPI IDirect3DTextureImpl_Unload(LPDIRECT3DTEXTURE iface) { ICOM_THIS(IDirect3DTexture2Impl,iface); FIXME("(%p)->(): stub\n", This); @@ -306,35 +310,35 @@ static HRESULT WINAPI IDirect3DTextureImpl_Unload(LPDIRECT3DTEXTURE iface) } /*** IDirect3DTexture2 methods ***/ -static HRESULT WINAPI IDirect3DTexture2Impl_GetHandle(LPDIRECT3DTEXTURE2 iface, +HRESULT WINAPI IDirect3DTexture2Impl_GetHandle(LPDIRECT3DTEXTURE2 iface, LPDIRECT3DDEVICE2 lpD3DDevice2, LPD3DTEXTUREHANDLE lpHandle) { - ICOM_THIS(IDirect3DTexture2Impl,iface); - IDirect3DDevice2Impl* ilpD3DDevice2=(IDirect3DDevice2Impl*)lpD3DDevice2; - TRACE("(%p)->(%p,%p)\n", This, ilpD3DDevice2, lpHandle); + ICOM_THIS(IDirect3DTexture2Impl,iface); + D3DTPRIVATE(This); + IDirect3DDevice2Impl* ilpD3DDevice2=(IDirect3DDevice2Impl*)lpD3DDevice2; + TRACE("(%p)->(%p,%p)\n", This, ilpD3DDevice2, lpHandle); - /* For 32 bits OSes, handles = pointers */ - *lpHandle = (D3DTEXTUREHANDLE) This; - - /* Now, bind a new texture */ - ENTER_GL(); - ilpD3DDevice2->set_context(ilpD3DDevice2); - This->D3Ddevice = (void *) ilpD3DDevice2; - if (This->tex_name == 0) - glGenTextures(1, &(This->tex_name)); - LEAVE_GL(); + /* For 32 bits OSes, handles = pointers */ + *lpHandle = (D3DTEXTUREHANDLE) This; - TRACE("OpenGL texture handle is : %ld\n", This->tex_name); - - return D3D_OK; + /* Now, bind a new texture */ + ENTER_GL(); + ilpD3DDevice2->set_context(ilpD3DDevice2); + This->D3Ddevice = (void *) ilpD3DDevice2; + if (dtpriv->tex_name == 0) + glGenTextures(1, &(dtpriv->tex_name)); + LEAVE_GL(); + + TRACE("OpenGL texture handle is : %d\n", dtpriv->tex_name); + + return D3D_OK; } /* Common methods */ -static HRESULT WINAPI IDirect3DTexture2Impl_PaletteChanged(LPDIRECT3DTEXTURE2 iface, - DWORD dwStart, - DWORD dwCount) -{ +HRESULT WINAPI IDirect3DTexture2Impl_PaletteChanged( + LPDIRECT3DTEXTURE2 iface, DWORD dwStart, DWORD dwCount +) { ICOM_THIS(IDirect3DTexture2Impl,iface); FIXME("(%p)->(%8ld,%8ld): stub\n", This, dwStart, dwCount); @@ -343,10 +347,11 @@ static HRESULT WINAPI IDirect3DTexture2Impl_PaletteChanged(LPDIRECT3DTEXTURE2 if /* NOTE : if you experience crashes in this function, you must have a buggy version of Mesa. See the file d3dtexture.c for a cure */ -static HRESULT WINAPI IDirect3DTexture2Impl_Load(LPDIRECT3DTEXTURE2 iface, - LPDIRECT3DTEXTURE2 lpD3DTexture2) -{ +HRESULT WINAPI IDirect3DTexture2Impl_Load( + LPDIRECT3DTEXTURE2 iface, LPDIRECT3DTEXTURE2 lpD3DTexture2 +) { ICOM_THIS(IDirect3DTexture2Impl,iface); + D3DTPRIVATE(This); IDirect3DTexture2Impl* ilpD3DTexture2=(IDirect3DTexture2Impl*)lpD3DTexture2; DDSURFACEDESC *src_d, *dst_d; TRACE("(%p)->(%p)\n", This, ilpD3DTexture2); @@ -387,9 +392,9 @@ static HRESULT WINAPI IDirect3DTexture2Impl_Load(LPDIRECT3DTEXTURE2 iface, glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); /* If the GetHandle was not done, get the texture name here */ - if (This->tex_name == 0) - glGenTextures(1, &(This->tex_name)); - glBindTexture(GL_TEXTURE_2D, This->tex_name); + if (dtpriv->tex_name == 0) + glGenTextures(1, &(dtpriv->tex_name)); + glBindTexture(GL_TEXTURE_2D, dtpriv->tex_name); if (src_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { /* **************** @@ -530,7 +535,7 @@ static HRESULT WINAPI IDirect3DTexture2Impl_Load(LPDIRECT3DTEXTURE2 iface, /******************************************************************************* * IDirect3DTexture2 VTable */ -static ICOM_VTABLE(IDirect3DTexture2) texture2_vtable = +ICOM_VTABLE(IDirect3DTexture2) mesa_texture2_vtable = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE /*** IUnknown methods ***/ @@ -546,7 +551,7 @@ static ICOM_VTABLE(IDirect3DTexture2) texture2_vtable = /******************************************************************************* * IDirect3DTexture VTable */ -static ICOM_VTABLE(IDirect3DTexture) texture_vtable = +ICOM_VTABLE(IDirect3DTexture) mesa_texture_vtable = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE /*** IUnknown methods ***/ @@ -560,18 +565,3 @@ static ICOM_VTABLE(IDirect3DTexture) texture_vtable = IDirect3DTexture2Impl_Load, IDirect3DTextureImpl_Unload }; - -#else /* HAVE_MESAGL */ - -/* These function should never be called if MesaGL is not present */ -LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf) { - ERR("Should not be called...\n"); - return NULL; -} - -LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf) { - ERR("Should not be called...\n"); - return NULL; -} - -#endif /* HAVE_MESAGL */ diff --git a/dlls/ddraw/dclipper/main.c b/dlls/ddraw/dclipper/main.c new file mode 100644 index 00000000000..5bb6f37d33e --- /dev/null +++ b/dlls/ddraw/dclipper/main.c @@ -0,0 +1,137 @@ +/* DirectDrawClipper implementation + * + * Copyright 2000 Marcus Meissner + */ + +#include "config.h" +#include "winerror.h" + +#include +#include +#include +#include +#include +#include + +#include "debugtools.h" +#include "ddraw_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +/****************************************************************************** + * DirectDrawCreateClipper (DDRAW.7) + */ +HRESULT WINAPI DirectDrawCreateClipper( + DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, LPUNKNOWN pUnkOuter +) { + IDirectDrawClipperImpl** ilplpDDClipper=(IDirectDrawClipperImpl**)lplpDDClipper; + TRACE("(%08lx,%p,%p)\n", dwFlags, ilplpDDClipper, pUnkOuter); + + *ilplpDDClipper = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipperImpl)); + ICOM_VTBL(*ilplpDDClipper) = &ddclipvt; + (*ilplpDDClipper)->ref = 1; + (*ilplpDDClipper)->hWnd = 0; + return DD_OK; +} + +/****************************************************************************** + * IDirectDrawClipper + */ +static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd( + LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd +) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + + TRACE("(%p)->SetHwnd(0x%08lx,0x%08lx)\n",This,dwFlags,(DWORD)hWnd); + if( dwFlags ) { + FIXME("dwFlags = 0x%08lx, not supported.\n",dwFlags); + return DDERR_INVALIDPARAMS; + } + + This->hWnd = hWnd; + return DD_OK; +} + +static ULONG WINAPI IDirectDrawClipperImpl_Release(LPDIRECTDRAWCLIPPER iface) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + This->ref--; + if (This->ref) + return This->ref; + HeapFree(GetProcessHeap(),0,This); + return S_OK; +} + +static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList( + LPDIRECTDRAWCLIPPER iface,LPRECT rects,LPRGNDATA lprgn,LPDWORD hmm +) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + FIXME("(%p,%p,%p,%p),stub!\n",This,rects,lprgn,hmm); + if (hmm) *hmm=0; + return DD_OK; +} + +static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList( + LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD hmm +) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + FIXME("(%p,%p,%ld),stub!\n",This,lprgn,hmm); + return DD_OK; +} + +static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface( + LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj +) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + FIXME("(%p)->(%p,%p),stub!\n",This,riid,ppvObj); + return OLE_E_ENUM_NOMORE; +} + +static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface ) +{ + ICOM_THIS(IDirectDrawClipperImpl,iface); + TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); + return ++(This->ref); +} + +static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd( + LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr +) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + FIXME("(%p)->(%p),stub!\n",This,hWndPtr); + + *hWndPtr = This->hWnd; + + return DD_OK; +} + +static HRESULT WINAPI IDirectDrawClipperImpl_Initialize( + LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags +) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + FIXME("(%p)->(%p,0x%08lx),stub!\n",This,lpDD,dwFlags); + return DD_OK; +} + +static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged( + LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged +) { + ICOM_THIS(IDirectDrawClipperImpl,iface); + FIXME("(%p)->(%p),stub!\n",This,lpbChanged); + return DD_OK; +} + +ICOM_VTABLE(IDirectDrawClipper) ddclipvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectDrawClipperImpl_QueryInterface, + IDirectDrawClipperImpl_AddRef, + IDirectDrawClipperImpl_Release, + IDirectDrawClipperImpl_GetClipList, + IDirectDrawClipperImpl_GetHWnd, + IDirectDrawClipperImpl_Initialize, + IDirectDrawClipperImpl_IsClipListChanged, + IDirectDrawClipperImpl_SetClipList, + IDirectDrawClipperImpl_SetHwnd +}; diff --git a/dlls/ddraw/ddraw.spec b/dlls/ddraw/ddraw.spec index ec39e94c69c..d5052b7d48f 100644 --- a/dlls/ddraw/ddraw.spec +++ b/dlls/ddraw/ddraw.spec @@ -1,11 +1,15 @@ name ddraw type win32 +import kernel32.dll +import user32.dll +import ole32.dll + @ stub DDHAL32_VidMemAlloc @ stub DDHAL32_VidMemFree @ stub DDInternalLock @ stub DDInternalUnlock -@ stdcall DSoundHelp(long long long) DSoundHelp +@ stub DSoundHelp @ stdcall DirectDrawCreate(ptr ptr ptr) DirectDrawCreate @ stdcall DirectDrawCreateClipper(long ptr ptr) DirectDrawCreateClipper @ stdcall DirectDrawEnumerateA(ptr ptr) DirectDrawEnumerateA diff --git a/dlls/ddraw/ddraw/dga.c b/dlls/ddraw/ddraw/dga.c new file mode 100644 index 00000000000..fcee086f344 --- /dev/null +++ b/dlls/ddraw/ddraw/dga.c @@ -0,0 +1,894 @@ +/* DirectDraw IDirectDraw XF86DGA interface + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff) + */ +/* XF86DGA: + * When DirectVideo mode is enabled you can no longer use 'normal' X + * applications nor can you switch to a virtual console. Also, enabling + * only works, if you have switched to the screen where the application + * is running. + * Some ways to debug this stuff are: + * - A terminal connected to the serial port. Can be bought used for cheap. + * (This is the method I am using.) + * - Another machine connected over some kind of network. + */ + +/* + * This file contains the XF86 DGA specific interface functions. + * We are 'allowed' to call X11 specific IDirectDraw functions. + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "wine/exception.h" +#include "ddraw.h" +#include "d3d.h" +#include "debugtools.h" +#include "message.h" +#include "options.h" +#include "monitor.h" + +#define RESTORE_SIGNALS + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#include "dga_private.h" + +struct ICOM_VTABLE(IDirectDraw) dga_ddvt; +struct ICOM_VTABLE(IDirectDraw2) dga_dd2vt; +struct ICOM_VTABLE(IDirectDraw4) dga_dd4vt; + +#ifdef HAVE_LIBXXF86VM +static XF86VidModeModeInfo *orig_mode = NULL; +#endif + +#define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->private) +#define DPPRIVATE(x) dga_dp_private *dppriv = ((dga_dp_private*)(x)->private) + +/******************************************************************************* + * IDirectDraw + */ +static HRESULT WINAPI DGA_IDirectDraw2Impl_CreateSurface( + LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf, + IUnknown *lpunk +) { + ICOM_THIS(IDirectDraw2Impl,iface); + IDirectDrawSurfaceImpl* dsurf; + DDPRIVATE(This); + dga_ds_private *dspriv; + int i, fbheight = ddpriv->fb_height; + + TRACE("(%p)->(%p,%p,%p)\n",This,lpddsd,lpdsf,lpunk); + if (TRACE_ON(ddraw)) _dump_surface_desc(lpddsd); + + *lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(IDirectDrawSurfaceImpl) + ); + dsurf = *(IDirectDrawSurfaceImpl**)lpdsf; + dsurf->private = (dga_ds_private*)HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(dga_ds_private) + ); + dspriv = (dga_ds_private*)dsurf->private; + IDirectDraw2_AddRef(iface); + + dsurf->ref = 1; +#ifdef HAVE_LIBXXF86DGA2 + if (ddpriv->version == 2) + ICOM_VTBL(dsurf) = (ICOM_VTABLE(IDirectDrawSurface)*)&dga2_dds4vt; + else +#endif /* defined(HAVE_LIBXXF86DGA2) */ + ICOM_VTBL(dsurf) = (ICOM_VTABLE(IDirectDrawSurface)*)&dga_dds4vt; + dsurf->s.ddraw = This; + dsurf->s.palette = NULL; + dspriv->fb_height = -1; /* This is to have non-on screen surfaces freed */ + dsurf->s.lpClipper = NULL; + + /* Copy the surface description */ + dsurf->s.surface_desc = *lpddsd; + + if (!(lpddsd->dwFlags & DDSD_WIDTH)) + dsurf->s.surface_desc.dwWidth = This->d.width; + if (!(lpddsd->dwFlags & DDSD_HEIGHT)) + dsurf->s.surface_desc.dwHeight = This->d.height; + + dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT; + + /* Check if this a 'primary surface' or not */ + if ((lpddsd->dwFlags & DDSD_CAPS) && + (lpddsd->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) { + /* This is THE primary surface => there is DGA-specific code */ + + /* Find a viewport */ + for (i=0;i<32;i++) + if (!(ddpriv->vpmask & (1<vpmask|=(1<lPitch = dsurf->s.surface_desc.lPitch = + ddpriv->fb_width*PFGET_BPP(This->d.directdraw_pixelformat); + + dsurf->s.surface_desc.u1.lpSurface = + ddpriv->fb_addr + i*fbheight*lpddsd->lPitch; + + dspriv->fb_height = i*fbheight; + + /* Add flags if there were not present */ + dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT; + dsurf->s.surface_desc.dwWidth = This->d.width; + dsurf->s.surface_desc.dwHeight = This->d.height; + TRACE("primary surface: dwWidth=%ld, dwHeight=%ld, lPitch=%ld\n",This->d.width,This->d.height,lpddsd->lPitch); + /* We put our surface always in video memory */ + SDDSCAPS(dsurf) |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY; + dsurf->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat; + dsurf->s.chain = NULL; + + if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) { + IDirectDrawSurface4Impl* back; + dga_ds_private *bspriv; + int bbc; + + for (bbc=lpddsd->dwBackBufferCount;bbc--;) { + int i; + + back = (IDirectDrawSurface4Impl*)HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(IDirectDrawSurface4Impl) + ); + IDirectDraw2_AddRef(iface); + back->ref = 1; + ICOM_VTBL(back) = (ICOM_VTABLE(IDirectDrawSurface4)*)&dga_dds4vt; + back->private = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(dga_ds_private) + ); + bspriv = (dga_ds_private*)back->private; + + for (i=0;i<32;i++) + if (!(ddpriv->vpmask & (1<vpmask|=(1<fb_height = i*fbheight; + /* Copy the surface description from the front buffer */ + back->s.surface_desc = dsurf->s.surface_desc; + /* Change the parameters that are not the same */ + back->s.surface_desc.u1.lpSurface = + ddpriv->fb_addr + i*fbheight*lpddsd->lPitch; + + back->s.ddraw = This; + /* Add relevant info to front and back buffers */ + /* FIXME: backbuffer/frontbuffer handling broken here, but + * will be fixed up in _Flip(). + */ + SDDSCAPS(dsurf) |= DDSCAPS_FRONTBUFFER; + SDDSCAPS(back) |= DDSCAPS_FLIP|DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY; + back->s.surface_desc.dwFlags &= ~DDSD_BACKBUFFERCOUNT; + SDDSCAPS(back) &= ~DDSCAPS_VISIBLE; + IDirectDrawSurface4_AddAttachedSurface((LPDIRECTDRAWSURFACE4)(*lpdsf),(LPDIRECTDRAWSURFACE4)back); + } + } + } else { + /* There is no DGA-specific code here... + * Go to the common surface creation function + */ + return common_off_screen_CreateSurface(This, dsurf); + } + return DD_OK; +} + +#ifdef HAVE_LIBXXF86DGA2 +static HRESULT WINAPI DGA_IDirectDraw2Impl_SetCooperativeLevel( + LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel +) { + ICOM_THIS(IDirectDraw2Impl,iface); + HRESULT ret; + int evbase, erbase; + + ret = IDirectDraw2Impl_SetCooperativeLevel(iface, hwnd, cooplevel); + + if (ddpriv->version != 2) { + return ret; + } else { + if (ret != DD_OK) + return ret; + + TSXDGAQueryExtension(display, &evbase, &erbase); + + /* Now, start handling of DGA events giving the handle to the DDraw window + as the window for which the event will be reported */ + TSXDGASelectInput(display, DefaultScreen(display), + KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask ); + X11DRV_EVENT_SetDGAStatus(hwnd, evbase); + return DD_OK; + } +} +#endif + +#ifdef HAVE_LIBXXF86DGA2 +static void _DGA_Initialize_FrameBuffer(IDirectDrawImpl *This, int mode) { + DDPIXELFORMAT *pf = &(This->d.directdraw_pixelformat); + + /* Now, get the device / mode description */ + ddpriv->dev = TSXDGASetMode(display, DefaultScreen(display), mode); + + ddpriv->fb_width = ddpriv->dev->mode.imageWidth; + TSXDGASetViewport(display,DefaultScreen(display),0,0, XDGAFlipImmediate); + ddpriv->fb_height = ddpriv->dev->mode.viewportHeight; + TRACE("video framebuffer: begin %p, width %d, memsize %d\n", + ddpriv->dev->data, + ddpriv->dev->mode.imageWidth, + (ddpriv->dev->mode.imageWidth * + ddpriv->dev->mode.imageHeight * + (ddpriv->dev->mode.bitsPerPixel / 8)) + ); + TRACE("viewport height: %d\n", ddpriv->dev->mode.viewportHeight); + /* Get the screen dimensions as seen by Wine. + * In that case, it may be better to ignore the -desktop mode and return the + * real screen size => print a warning */ + This->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); + This->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); + ddpriv->fb_addr = ddpriv->dev->data; + ddpriv->fb_memsize = (ddpriv->dev->mode.imageWidth * + ddpriv->dev->mode.imageHeight * + (ddpriv->dev->mode.bitsPerPixel / 8)); + ddpriv->vpmask = 0; + + /* Fill the screen pixelformat */ + pf->dwSize = sizeof(DDPIXELFORMAT); + pf->dwFourCC = 0; + pf->u.dwRGBBitCount = ddpriv->dev->mode.bitsPerPixel; + if (ddpriv->dev->mode.depth == 8) { + pf->dwFlags = DDPF_PALETTEINDEXED8|DDPF_RGB; + pf->u1.dwRBitMask = 0; + pf->u2.dwGBitMask = 0; + pf->u3.dwBBitMask = 0; + } else { + pf->dwFlags = DDPF_RGB; + pf->u1.dwRBitMask = ddpriv->dev->mode.redMask; + pf->u2.dwGBitMask = ddpriv->dev->mode.greenMask; + pf->u3.dwBBitMask = ddpriv->dev->mode.blueMask; + } + pf->u4.dwRGBAlphaBitMask= 0; + This->d.screen_pixelformat = *pf; +} +#endif /* defined(HAVE_LIBXXF86DGA2) */ + +static HRESULT WINAPI DGA_IDirectDrawImpl_SetDisplayMode( + LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth +) { + ICOM_THIS(IDirectDrawImpl,iface); + DDPRIVATE(This); + int i,mode_count; + + TRACE("(%p)->(%ld,%ld,%ld)\n", This, width, height, depth); + +#ifdef HAVE_LIBXXF86DGA2 + if (ddpriv->version == 2) { + XDGAMode *modes = ddpriv->modes; + int mode_to_use = -1; + + /* Search in the list a display mode that corresponds to what is requested */ + for (i = 0; i < ddpriv->num_modes; i++) { + if ((height == modes[i].viewportHeight) && + (width == modes[i].viewportWidth) && + (depth == modes[i].depth) + ) + mode_to_use = modes[i].num; + } + + if (mode_to_use < 0) { + ERR("Could not find matching mode !!!\n"); + return DDERR_UNSUPPORTEDMODE; + } else { + TRACE("Using mode number %d\n", mode_to_use); + + TSXDGACloseFramebuffer(display, DefaultScreen(display)); + + if (!TSXDGAOpenFramebuffer(display, DefaultScreen(display))) { + ERR("Error opening the frame buffer !!!\n"); + return DDERR_GENERIC; + } + + /* Initialize the frame buffer */ + _DGA_Initialize_FrameBuffer(This, mode_to_use); + + /* Re-get (if necessary) the DGA events */ + TSXDGASelectInput(display, DefaultScreen(display), + KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask ); + } + + return DD_OK; + } +#endif /* defined(HAVE_LIBXXF86DGA2) */ + + /* We hope getting the asked for depth */ + if (_common_depth_to_pixelformat(depth, &(This->d.directdraw_pixelformat), &(This->d.screen_pixelformat), NULL) != -1) { + /* I.e. no visual found or emulated */ + ERR("(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth); + return DDERR_UNSUPPORTEDMODE; + } + + if (This->d.width < width) { + ERR("SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,This->d.width); + return DDERR_UNSUPPORTEDMODE; + } + This->d.width = width; + This->d.height = height; + + /* adjust fb_height, so we don't overlap */ + if (ddpriv->fb_height < height) + ddpriv->fb_height = height; + _common_IDirectDrawImpl_SetDisplayMode(This); + +#ifdef HAVE_LIBXXF86VM +#ifdef HAVE_LIBXXF86DGA2 + if (ddpriv->version == 1) /* Only for DGA 1.0, it crashes with DGA 2.0 */ +#endif /* defined(HAVE_LIBXXF86DGA2) */ + { + XF86VidModeModeInfo **all_modes, *vidmode = NULL; + XF86VidModeModeLine mod_tmp; + /* int dotclock_tmp; */ + + /* save original video mode and set fullscreen if available*/ + orig_mode = (XF86VidModeModeInfo *)malloc(sizeof(XF86VidModeModeInfo)); + TSXF86VidModeGetModeLine(display, DefaultScreen(display), &orig_mode->dotclock, &mod_tmp); + orig_mode->hdisplay = mod_tmp.hdisplay; + orig_mode->hsyncstart = mod_tmp.hsyncstart; + orig_mode->hsyncend = mod_tmp.hsyncend; + orig_mode->htotal = mod_tmp.htotal; + orig_mode->vdisplay = mod_tmp.vdisplay; + orig_mode->vsyncstart = mod_tmp.vsyncstart; + orig_mode->vsyncend = mod_tmp.vsyncend; + orig_mode->vtotal = mod_tmp.vtotal; + orig_mode->flags = mod_tmp.flags; + orig_mode->private = mod_tmp.private; + + TSXF86VidModeGetAllModeLines(display,DefaultScreen(display),&mode_count,&all_modes); + for (i=0;ihdisplay == width && + all_modes[i]->vdisplay == height + ) { + vidmode = (XF86VidModeModeInfo *)malloc(sizeof(XF86VidModeModeInfo)); + *vidmode = *(all_modes[i]); + break; + } else + TSXFree(all_modes[i]->private); + } + for (i++;iprivate); + TSXFree(all_modes); + + if (!vidmode) + WARN("Fullscreen mode not available!\n"); + + if (vidmode) { + TRACE("SwitchToMode(%dx%d)\n",vidmode->hdisplay,vidmode->vdisplay); + TSXF86VidModeSwitchToMode(display, DefaultScreen(display), vidmode); +#if 0 /* This messes up my screen (XF86_Mach64, 3.3.2.3a) for some reason, and should now be unnecessary */ + TSXF86VidModeSetViewPort(display, DefaultScreen(display), 0, 0); +#endif + } + } +#endif + + /* FIXME: this function OVERWRITES several signal handlers. + * can we save them? and restore them later? In a way that + * it works for the library too? + */ + TSXF86DGADirectVideo(display,DefaultScreen(display),XF86DGADirectGraphics); + TSXF86DGASetViewPort(display,DefaultScreen(display),0,0); + +#ifdef RESTORE_SIGNALS + SIGNAL_Init(); +#endif + return DD_OK; +} + +static HRESULT WINAPI DGA_IDirectDraw2Impl_GetCaps( + LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2 +) { + ICOM_THIS(IDirectDraw2Impl,iface); + DDPRIVATE(This); + + TRACE("(%p)->GetCaps(%p,%p)\n",This,caps1,caps2); + if (!caps1 && !caps2) + return DDERR_INVALIDPARAMS; + if (caps1) { + caps1->dwVidMemTotal = ddpriv->fb_memsize; + caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED); /* we can do anything */ + caps1->ddsCaps.dwCaps = 0xffffffff; /* we can do anything */ + } + if (caps2) { + caps2->dwVidMemTotal = ddpriv->fb_memsize; + caps2->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED); /* we can do anything */ + caps2->ddsCaps.dwCaps = 0xffffffff; /* we can do anything */ + } + return DD_OK; +} + +static void fill_caps(LPDDCAPS caps) { + /* This function tries to fill the capabilities of Wine's DDraw + * implementation. Needs to be fixed, though.. */ + if (caps == NULL) + return; + + caps->dwSize = sizeof(*caps); + caps->dwCaps = DDCAPS_ALPHA | DDCAPS_BLT | DDCAPS_BLTSTRETCH | DDCAPS_BLTCOLORFILL | DDCAPS_BLTDEPTHFILL | DDCAPS_CANBLTSYSMEM | DDCAPS_COLORKEY | DDCAPS_PALETTE /*| DDCAPS_NOHARDWARE*/; + caps->dwCaps2 = DDCAPS2_CERTIFIED | DDCAPS2_NOPAGELOCKREQUIRED | DDCAPS2_WIDESURFACES; + caps->dwCKeyCaps = 0xFFFFFFFF; /* Should put real caps here one day... */ + caps->dwFXCaps = 0; + caps->dwFXAlphaCaps = 0; + caps->dwPalCaps = DDPCAPS_8BIT | DDPCAPS_ALLOW256; + caps->dwSVCaps = 0; + caps->dwZBufferBitDepths = DDBD_16; + /* I put here 8 Mo so that D3D applications will believe they have enough + * memory to put textures in video memory. + * BTW, is this only frame buffer memory or also texture memory (for Voodoo + * boards for example) ? + */ + caps->dwVidMemTotal = 8192 * 1024; + caps->dwVidMemFree = 8192 * 1024; + /* These are all the supported capabilities of the surfaces */ + caps->ddsCaps.dwCaps = DDSCAPS_ALPHA | DDSCAPS_BACKBUFFER | DDSCAPS_COMPLEX | DDSCAPS_FLIP | + DDSCAPS_FRONTBUFFER | DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM | DDSCAPS_OFFSCREENPLAIN | + /*DDSCAPS_OVERLAY |*/ DDSCAPS_PALETTE | DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY | + DDSCAPS_VIDEOMEMORY | DDSCAPS_VISIBLE; +#ifdef HAVE_MESAGL + caps->dwCaps |= DDCAPS_3D | DDCAPS_ZBLTS; + caps->dwCaps2 |= DDCAPS2_NO2DDURING3DSCENE; + caps->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE | DDSCAPS_MIPMAP | DDSCAPS_TEXTURE | DDSCAPS_ZBUFFER; +#endif +} + +static HRESULT WINAPI DGA_IDirectDraw2Impl_CreatePalette( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk +) { + ICOM_THIS(IDirectDraw2Impl,iface); + IDirectDrawPaletteImpl* ddpal; + dga_dp_private *dppriv; + HRESULT res; + int xsize = 0,i; + + TRACE("(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,lpddpal,lpunk); + res = common_IDirectDraw2Impl_CreatePalette(This,dwFlags,palent,(IDirectDrawPaletteImpl**)lpddpal,lpunk,&xsize); + if (res != 0) + return res; + ddpal = *(IDirectDrawPaletteImpl**)lpddpal; + ddpal->private = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(dga_dp_private) + ); + dppriv = (dga_dp_private*)ddpal->private; + + ICOM_VTBL(ddpal)= &dga_ddpalvt; + if (This->d.directdraw_pixelformat.u.dwRGBBitCount<=8) { + dppriv->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(X11DRV_GetXScreen()),AllocAll); + } else { + ERR("why are we doing CreatePalette in hi/truecolor?\n"); + dppriv->cm = 0; + } + if (dppriv->cm && xsize) { + for (i=0;ipalents[i].peRed<<8; + xc.blue = ddpal->palents[i].peBlue<<8; + xc.green = ddpal->palents[i].peGreen<<8; + xc.flags = DoRed|DoBlue|DoGreen; + xc.pixel = i; + TSXStoreColor(display,dppriv->cm,&xc); + } + } + return DD_OK; +} + +static HRESULT WINAPI DGA_IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 iface) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->()\n",This); + Sleep(1000); + TSXF86DGADirectVideo(display,DefaultScreen(display),0); +#ifdef RESTORE_SIGNALS + SIGNAL_Init(); +#endif + return DD_OK; +} + +static ULONG WINAPI DGA_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { +#ifdef HAVE_LIBXXF86DGA2 + if (ddpriv->version == 2) { + TRACE("Closing access to the FrameBuffer\n"); + TSXDGACloseFramebuffer(display, DefaultScreen(display)); + TRACE("Going back to normal X mode of operation\n"); + TSXDGASetMode(display, DefaultScreen(display), 0); + + /* Set the input handling back to absolute */ + X11DRV_EVENT_SetInputMethod(X11DRV_INPUT_ABSOLUTE); + + /* Remove the handling of DGA2 events */ + X11DRV_EVENT_SetDGAStatus(0, -1); + + /* Free the modes list */ + TSXFree(ddpriv->modes); + } else +#endif /* defined(HAVE_LIBXXF86DGA2) */ + TSXF86DGADirectVideo(display,DefaultScreen(display),0); + if (This->d.window && GetPropA(This->d.window,ddProp)) + DestroyWindow(This->d.window); +#ifdef HAVE_LIBXXF86VM + if (orig_mode) { + TSXF86VidModeSwitchToMode( + display, + DefaultScreen(display), + orig_mode + ); + if (orig_mode->privsize) + TSXFree(orig_mode->private); + free(orig_mode); + orig_mode = NULL; + } +#endif + +#ifdef RESTORE_SIGNALS + SIGNAL_Init(); +#endif + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +static HRESULT WINAPI DGA_IDirectDraw2Impl_QueryInterface( + LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj +) { + ICOM_THIS(IDirectDraw2Impl,iface); + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + if ( IsEqualGUID( &IID_IUnknown, refiid ) ) { + *obj = This; + IDirectDraw2_AddRef(iface); + + TRACE(" Creating IUnknown interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) { + ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_ddvt; + IDirectDraw2_AddRef(iface); + *obj = This; + + TRACE(" Creating IDirectDraw interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) { + ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd2vt; + IDirectDraw2_AddRef(iface); + *obj = This; + + TRACE(" Creating IDirectDraw2 interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) { + ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd4vt; + IDirectDraw2_AddRef(iface); + *obj = This; + + TRACE(" Creating IDirectDraw4 interface (%p)\n", *obj); + + return S_OK; + } + FIXME("(%p):interface for IID %s _NOT_ found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +static HRESULT WINAPI DGA_IDirectDraw2Impl_EnumDisplayModes( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb +) { + ICOM_THIS(IDirectDraw2Impl,iface); + DDSURFACEDESC ddsfd; + static struct { + int w,h; + } modes[5] = { /* some usual modes */ + {512,384}, + {640,400}, + {640,480}, + {800,600}, + {1024,768}, + }; + static int depths[4] = {8,16,24,32}; + int i,j; + + TRACE("(%p)->(0x%08lx,%p,%p,%p)\n",This,dwFlags,lpddsfd,context,modescb); + ddsfd.dwSize = sizeof(ddsfd); + ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; + if (dwFlags & DDEDM_REFRESHRATES) { + ddsfd.dwFlags |= DDSD_REFRESHRATE; + ddsfd.u.dwRefreshRate = 60; + } + ddsfd.ddsCaps.dwCaps = 0; + ddsfd.dwBackBufferCount = 1; + +#ifdef HAVE_LIBXXF86DGA2 + if (ddpriv->version == 2) { + XDGAMode *modes = ddpriv->modes; + + ddsfd.dwFlags |= DDSD_PITCH; + for (i = 0; i < ddpriv->num_modes; i++) { + if (TRACE_ON(ddraw)) { + DPRINTF(" Enumerating mode %d : %s (FB: %dx%d / VP: %dx%d) - depth %d -", + modes[i].num, + modes[i].name, modes[i].imageWidth, modes[i].imageHeight, + modes[i].viewportWidth, modes[i].viewportHeight, + modes[i].depth); + if (modes[i].flags & XDGAConcurrentAccess) DPRINTF(" XDGAConcurrentAccess "); + if (modes[i].flags & XDGASolidFillRect) DPRINTF(" XDGASolidFillRect "); + if (modes[i].flags & XDGABlitRect) DPRINTF(" XDGABlitRect "); + if (modes[i].flags & XDGABlitTransRect) DPRINTF(" XDGABlitTransRect "); + if (modes[i].flags & XDGAPixmap) DPRINTF(" XDGAPixmap "); + DPRINTF("\n"); + } + /* Fill the pixel format */ + ddsfd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + ddsfd.ddpfPixelFormat.dwFourCC = 0; + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + ddsfd.ddpfPixelFormat.u.dwRGBBitCount = modes[i].bitsPerPixel; + if (modes[i].depth == 8) { + ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; + ddsfd.ddsCaps.dwCaps = DDSCAPS_PALETTE; + } else { + ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB; + ddsfd.ddpfPixelFormat.u1.dwRBitMask = modes[i].redMask; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = modes[i].greenMask; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = modes[i].blueMask; + } + + ddsfd.dwWidth = modes[i].viewportWidth; + ddsfd.dwHeight = modes[i].viewportHeight; + ddsfd.lPitch = modes[i].imageWidth; + + /* Send mode to the application */ + if (!modescb(&ddsfd,context)) return DD_OK; + } + } else { +#endif + for (i=0;i 8 */ + if (depths[i]==8) { + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + ddsfd.ddsCaps.dwCaps=DDSCAPS_PALETTE; + ddsfd.ddpfPixelFormat.dwFlags|=DDPF_PALETTEINDEXED8; + } else { + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + + /* FIXME: We should query those from X itself */ + switch (depths[i]) { + case 16: + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0xF800; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x07E0; + ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x001F; + break; + case 24: + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0x00FF0000; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x0000FF00; + ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x000000FF; + break; + case 32: + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0x00FF0000; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x0000FF00; + ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x000000FF; + break; + } + } + + ddsfd.dwWidth = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); + ddsfd.dwHeight = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); + TRACE(" enumerating (%ldx%ldx%d)\n",ddsfd.dwWidth,ddsfd.dwHeight,depths[i]); + if (!modescb(&ddsfd,context)) return DD_OK; + + for (j=0;j(%p)\n",This,lpddsfd); + lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; + lpddsfd->dwHeight = This->d.height; + lpddsfd->dwWidth = This->d.width; + lpddsfd->lPitch = ddpriv->fb_width*PFGET_BPP(This->d.directdraw_pixelformat); + lpddsfd->dwBackBufferCount = 2; + lpddsfd->u.dwRefreshRate = 60; + lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE; + lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat; + if (TRACE_ON(ddraw)) + _dump_surface_desc(lpddsfd); + return DD_OK; +} + +/* Note: Hack so we can reuse the old functions without compiler warnings */ +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(dga_ddvt.fn##fun)) +#else +# define XCAST(fun) (void *) +#endif + +struct ICOM_VTABLE(IDirectDraw) dga_ddvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + XCAST(QueryInterface)DGA_IDirectDraw2Impl_QueryInterface, + XCAST(AddRef)IDirectDraw2Impl_AddRef, + XCAST(Release)DGA_IDirectDraw2Impl_Release, + XCAST(Compact)IDirectDraw2Impl_Compact, + XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, + XCAST(CreatePalette)DGA_IDirectDraw2Impl_CreatePalette, + XCAST(CreateSurface)DGA_IDirectDraw2Impl_CreateSurface, + XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, + XCAST(EnumDisplayModes)DGA_IDirectDraw2Impl_EnumDisplayModes, + XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, + XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, + XCAST(GetCaps)DGA_IDirectDraw2Impl_GetCaps, + XCAST(GetDisplayMode)DGA_IDirectDraw2Impl_GetDisplayMode, + XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, + XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, + XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, + XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, + XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, + XCAST(Initialize)IDirectDraw2Impl_Initialize, + XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode, +#ifdef HAVE_LIBXXF86DGA2 + XCAST(SetCooperativeLevel)DGA_IDirectDraw2Impl_SetCooperativeLevel, +#else + XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel, +#endif + DGA_IDirectDrawImpl_SetDisplayMode, + XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, +}; +#undef XCAST + +/***************************************************************************** + * IDirectDraw2 + * + */ + +static HRESULT WINAPI DGA_IDirectDraw2Impl_SetDisplayMode( + LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth,DWORD dwRefreshRate, DWORD dwFlags +) { + FIXME( "Ignored parameters (0x%08lx,0x%08lx)\n", dwRefreshRate, dwFlags ); + return DGA_IDirectDrawImpl_SetDisplayMode((LPDIRECTDRAW)iface,width,height,depth); +} + +static HRESULT WINAPI DGA_IDirectDraw2Impl_GetAvailableVidMem( + LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free +) { + ICOM_THIS(IDirectDraw2Impl,iface); + DDPRIVATE(This); + + TRACE("(%p)->(%p,%p,%p)\n",This,ddscaps,total,free); + if (total) *total = ddpriv->fb_memsize * 1024; + if (free) *free = ddpriv->fb_memsize * 1024; + return DD_OK; +} + +ICOM_VTABLE(IDirectDraw2) dga_dd2vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + DGA_IDirectDraw2Impl_QueryInterface, + IDirectDraw2Impl_AddRef, + DGA_IDirectDraw2Impl_Release, + IDirectDraw2Impl_Compact, + IDirectDraw2Impl_CreateClipper, + DGA_IDirectDraw2Impl_CreatePalette, + DGA_IDirectDraw2Impl_CreateSurface, + IDirectDraw2Impl_DuplicateSurface, + DGA_IDirectDraw2Impl_EnumDisplayModes, + IDirectDraw2Impl_EnumSurfaces, + IDirectDraw2Impl_FlipToGDISurface, + DGA_IDirectDraw2Impl_GetCaps, + DGA_IDirectDraw2Impl_GetDisplayMode, + IDirectDraw2Impl_GetFourCCCodes, + IDirectDraw2Impl_GetGDISurface, + IDirectDraw2Impl_GetMonitorFrequency, + IDirectDraw2Impl_GetScanLine, + IDirectDraw2Impl_GetVerticalBlankStatus, + IDirectDraw2Impl_Initialize, + DGA_IDirectDraw2Impl_RestoreDisplayMode, + IDirectDraw2Impl_SetCooperativeLevel, + DGA_IDirectDraw2Impl_SetDisplayMode, + IDirectDraw2Impl_WaitForVerticalBlank, + DGA_IDirectDraw2Impl_GetAvailableVidMem +}; + +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(dga_dd4vt.fn##fun)) +#else +# define XCAST(fun) (void*) +#endif + +ICOM_VTABLE(IDirectDraw4) dga_dd4vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + XCAST(QueryInterface)DGA_IDirectDraw2Impl_QueryInterface, + XCAST(AddRef)IDirectDraw2Impl_AddRef, + XCAST(Release)DGA_IDirectDraw2Impl_Release, + XCAST(Compact)IDirectDraw2Impl_Compact, + XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, + XCAST(CreatePalette)DGA_IDirectDraw2Impl_CreatePalette, + XCAST(CreateSurface)DGA_IDirectDraw2Impl_CreateSurface, + XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, + XCAST(EnumDisplayModes)DGA_IDirectDraw2Impl_EnumDisplayModes, + XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, + XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, + XCAST(GetCaps)DGA_IDirectDraw2Impl_GetCaps, + XCAST(GetDisplayMode)DGA_IDirectDraw2Impl_GetDisplayMode, + XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, + XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, + XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, + XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, + XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, + XCAST(Initialize)IDirectDraw2Impl_Initialize, + XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode, + XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel, + XCAST(SetDisplayMode)DGA_IDirectDrawImpl_SetDisplayMode, + XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, + XCAST(GetAvailableVidMem)DGA_IDirectDraw2Impl_GetAvailableVidMem, + IDirectDraw4Impl_GetSurfaceFromDC, + IDirectDraw4Impl_RestoreAllSurfaces, + IDirectDraw4Impl_TestCooperativeLevel, + IDirectDraw4Impl_GetDeviceIdentifier +}; +#undef XCAST diff --git a/dlls/ddraw/ddraw/main.c b/dlls/ddraw/ddraw/main.c new file mode 100644 index 00000000000..e6a741cb754 --- /dev/null +++ b/dlls/ddraw/ddraw/main.c @@ -0,0 +1,557 @@ +/* DirectDraw IDirectDraw interface (generic) + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff) + */ + +/* + * This file contains all the interface functions that are shared between + * all interfaces. Or better, it is a "common stub" library for the IDirectDraw* + * objects + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "ddraw.h" +#include "d3d.h" +#include "debugtools.h" +#include "message.h" +#include "options.h" +#include "monitor.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#include "ddraw_private.h" + +HRESULT WINAPI IDirectDraw2Impl_DuplicateSurface( + LPDIRECTDRAW2 iface,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst +) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->(%p,%p) simply copies\n",This,src,dst); + *dst = src; /* FIXME */ + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_SetCooperativeLevel( + LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel +) { + ICOM_THIS(IDirectDraw2Impl,iface); + + FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel); + _dump_cooperativelevel(cooplevel); + This->d.mainWindow = hwnd; + return DD_OK; +} + +/* + * Small helper to either use the cooperative window or create a new + * one (for mouse and keyboard input) and drawing in the Xlib implementation. + * + * Note this just uses USER calls, so it is safe in here. + */ +void _common_IDirectDrawImpl_SetDisplayMode(IDirectDrawImpl* This) { + RECT rect; + + /* Do destroy only our window */ + if (This->d.window && GetPropA(This->d.window,ddProp)) { + DestroyWindow(This->d.window); + This->d.window = 0; + } + /* Sanity check cooperative window before assigning it to drawing. */ + if (IsWindow(This->d.mainWindow) && + IsWindowVisible(This->d.mainWindow) + ) { + GetWindowRect(This->d.mainWindow,&rect); + if ((((rect.right-rect.left) >= This->d.width) && + ((rect.bottom-rect.top) >= This->d.height)) + ) { + This->d.window = This->d.mainWindow; + /* FIXME: resizing is not windows compatible behaviour, need test */ + /* SetWindowPos(This->d.mainWindow,HWND_TOPMOST,0,0,This->d.width,This->d.height,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); */ + This->d.paintable = 1; /* don't wait for WM_PAINT */ + } + } + /* ... failed, create new one. */ + if (!This->d.window) { + This->d.window = CreateWindowExA( + 0, + "WINE_DirectDraw", + "WINE_DirectDraw", + WS_VISIBLE|WS_SYSMENU|WS_THICKFRAME|WS_BORDER, + 0,0, + This->d.width, + This->d.height, + 0, + 0, + 0, + NULL + ); + /*Store THIS with the window. We'll use it in the window procedure*/ + SetPropA(This->d.window,ddProp,(LONG)This); + ShowWindow(This->d.window,TRUE); + UpdateWindow(This->d.window); + } + SetFocus(This->d.window); +} + +HRESULT WINAPI IDirectDrawImpl_SetDisplayMode( + LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth +) { + ICOM_THIS(IDirectDrawImpl,iface); + + FIXME("(%p)->SetDisplayMode(%ld,%ld,%ld), needs to be implemented for your display adapter!\n",This,width,height,depth); + This->d.width = width; + This->d.height = height; + _common_IDirectDrawImpl_SetDisplayMode(This); + return DD_OK; +} + +static void fill_caps(LPDDCAPS caps) { + /* This function tries to fill the capabilities of Wines DDraw + * implementation. Needs to be fixed, though.. */ + if (caps == NULL) + return; + + caps->dwSize = sizeof(*caps); + caps->dwCaps = DDCAPS_ALPHA | DDCAPS_BLT | DDCAPS_BLTSTRETCH | DDCAPS_BLTCOLORFILL | DDCAPS_BLTDEPTHFILL | DDCAPS_CANBLTSYSMEM | DDCAPS_COLORKEY | DDCAPS_PALETTE /*| DDCAPS_NOHARDWARE*/; + caps->dwCaps2 = DDCAPS2_CERTIFIED | DDCAPS2_NOPAGELOCKREQUIRED | DDCAPS2_WIDESURFACES; + caps->dwCKeyCaps = 0xFFFFFFFF; /* Should put real caps here one day... */ + caps->dwFXCaps = 0; + caps->dwFXAlphaCaps = 0; + caps->dwPalCaps = DDPCAPS_8BIT | DDPCAPS_ALLOW256; + caps->dwSVCaps = 0; + caps->dwZBufferBitDepths = DDBD_16; + /* I put here 8 Mo so that D3D applications will believe they have enough + * memory to put textures in video memory. BTW, is this only frame buffer + * memory or also texture memory (for Voodoo boards for example) ? + */ + caps->dwVidMemTotal = 8192 * 1024; + caps->dwVidMemFree = 8192 * 1024; + /* These are all the supported capabilities of the surfaces */ + caps->ddsCaps.dwCaps = DDSCAPS_ALPHA | DDSCAPS_BACKBUFFER | DDSCAPS_COMPLEX | DDSCAPS_FLIP | + DDSCAPS_FRONTBUFFER | DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM | DDSCAPS_OFFSCREENPLAIN | + /*DDSCAPS_OVERLAY |*/ DDSCAPS_PALETTE | DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY | + DDSCAPS_VIDEOMEMORY | DDSCAPS_VISIBLE; +} + +HRESULT WINAPI IDirectDraw2Impl_GetCaps( + LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2 +) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->GetCaps(%p,%p)\n",This,caps1,caps2); + + /* Put the same caps for the two capabilities */ + fill_caps(caps1); + fill_caps(caps2); + + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_CreateClipper( + LPDIRECTDRAW2 iface,DWORD x,LPDIRECTDRAWCLIPPER *lpddclip,LPUNKNOWN lpunk +) { + ICOM_THIS(IDirectDraw2Impl,iface); + IDirectDrawClipperImpl** ilpddclip=(IDirectDrawClipperImpl**)lpddclip; + FIXME("(%p)->(%08lx,%p,%p),stub!\n", This,x,ilpddclip,lpunk); + *ilpddclip = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipperImpl)); + (*ilpddclip)->ref = 1; + ICOM_VTBL(*ilpddclip) = &ddclipvt; + return DD_OK; +} + +HRESULT WINAPI common_IDirectDraw2Impl_CreatePalette( + IDirectDraw2Impl* This,DWORD dwFlags,LPPALETTEENTRY palent, + IDirectDrawPaletteImpl **lpddpal,LPUNKNOWN lpunk,int *psize +) { + int size = 0; + + if (TRACE_ON(ddraw)) + _dump_paletteformat(dwFlags); + + *lpddpal = (IDirectDrawPaletteImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPaletteImpl)); + if (*lpddpal == NULL) return E_OUTOFMEMORY; + (*lpddpal)->ref = 1; + (*lpddpal)->ddraw = (IDirectDrawImpl*)This; + + if (dwFlags & DDPCAPS_1BIT) + size = 2; + else if (dwFlags & DDPCAPS_2BIT) + size = 4; + else if (dwFlags & DDPCAPS_4BIT) + size = 16; + else if (dwFlags & DDPCAPS_8BIT) + size = 256; + else + ERR("unhandled palette format\n"); + + *psize = size; + if (palent) { + /* Now, if we are in depth conversion mode, create the screen palette */ + if (This->d.palette_convert != NULL) + This->d.palette_convert(palent,(*lpddpal)->screen_palents,0,size); + + memcpy((*lpddpal)->palents, palent, size * sizeof(PALETTEENTRY)); + } else if (This->d.palette_convert != NULL) { + /* In that case, put all 0xFF */ + memset((*lpddpal)->screen_palents, 0xFF, 256 * sizeof(int)); + } + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_CreatePalette( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk +) { + ICOM_THIS(IDirectDraw2Impl,iface); + IDirectDrawPaletteImpl** ilpddpal=(IDirectDrawPaletteImpl**)lpddpal; + int xsize; + HRESULT res; + + TRACE("(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,ilpddpal,lpunk); + res = common_IDirectDraw2Impl_CreatePalette(This,dwFlags,palent,ilpddpal,lpunk,&xsize); + if (res != 0) return res; + ICOM_VTBL(*ilpddpal) = &ddraw_ddpalvt; + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 iface) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->RestoreDisplayMode()\n", This); + Sleep(1000); + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_WaitForVerticalBlank( + LPDIRECTDRAW2 iface,DWORD x,HANDLE h +) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->(flags=0x%08lx,handle=0x%08x)\n",This,x,h); + return DD_OK; +} + +ULONG WINAPI IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); + + return ++(This->ref); +} + +ULONG WINAPI IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + if (This->d.window && GetPropA(This->d.window,ddProp)) + DestroyWindow(This->d.window); + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +HRESULT WINAPI IDirectDraw2Impl_QueryInterface( + LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj +) { + ICOM_THIS(IDirectDraw2Impl,iface); + + if ( IsEqualGUID( &IID_IUnknown, refiid ) ) { + *obj = This; + IDirectDraw2_AddRef(iface); + TRACE(" Creating IUnknown interface (%p)\n", *obj); + return S_OK; + } + ERR("(%p)->(%s,%p), must be implemented by display interface!\n",This,debugstr_guid(refiid),obj); + return OLE_E_ENUM_NOMORE; +} + +HRESULT WINAPI IDirectDraw2Impl_GetVerticalBlankStatus( + LPDIRECTDRAW2 iface,BOOL *status +) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->(%p)\n",This,status); + *status = TRUE; + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_EnumDisplayModes( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context, + LPDDENUMMODESCALLBACK modescb +) { + ICOM_THIS(IDirectDraw2Impl,iface); + DDSURFACEDESC ddsfd; + static struct { + int w,h; + } modes[5] = { /* some of the usual modes */ + {512,384}, + {640,400}, + {640,480}, + {800,600}, + {1024,768}, + }; + static int depths[4] = {8,16,24,32}; + int i,j; + + TRACE("(%p)->(0x%08lx,%p,%p,%p)\n",This,dwFlags,lpddsfd,context,modescb); + ddsfd.dwSize = sizeof(ddsfd); + ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; + if (dwFlags & DDEDM_REFRESHRATES) { + ddsfd.dwFlags |= DDSD_REFRESHRATE; + ddsfd.u.dwRefreshRate = 60; + } + ddsfd.ddsCaps.dwCaps = 0; + ddsfd.dwBackBufferCount = 1; + + for (i=0;i 8 */ + if (depths[i]==8) { + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + ddsfd.ddsCaps.dwCaps=DDSCAPS_PALETTE; + ddsfd.ddpfPixelFormat.dwFlags|=DDPF_PALETTEINDEXED8; + } else { + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + + /* FIXME: We should query those from X itself */ + switch (depths[i]) { + case 16: + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0xF800; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x07E0; + ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x001F; + break; + case 24: + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0x00FF0000; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x0000FF00; + ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x000000FF; + break; + case 32: + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0x00FF0000; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x0000FF00; + ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x000000FF; + break; + } + } + + ddsfd.dwWidth = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); + ddsfd.dwHeight = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); + TRACE(" enumerating (%ldx%ldx%d)\n",ddsfd.dwWidth,ddsfd.dwHeight,depths[i]); + if (!modescb(&ddsfd,context)) return DD_OK; + + for (j=0;jGetDisplayMode(%p)\n",This,lpddsfd); + lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; + lpddsfd->dwHeight = This->d.height; + lpddsfd->dwWidth = This->d.width; + lpddsfd->lPitch =lpddsfd->dwWidth*PFGET_BPP(This->d.directdraw_pixelformat); + lpddsfd->dwBackBufferCount = 2; + lpddsfd->u.dwRefreshRate = 60; + lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE; + lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat; + if (TRACE_ON(ddraw)) + _dump_surface_desc(lpddsfd); + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 iface) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->()\n",This); + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_GetMonitorFrequency( + LPDIRECTDRAW2 iface,LPDWORD freq +) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->(%p) returns 60 Hz always\n",This,freq); + *freq = 60*100; /* 60 Hz */ + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_GetFourCCCodes( + LPDIRECTDRAW2 iface,LPDWORD x,LPDWORD y +) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p,%p,%p), stub\n",This,x,y); + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_EnumSurfaces( + LPDIRECTDRAW2 iface,DWORD x,LPDDSURFACEDESC ddsfd,LPVOID context, + LPDDENUMSURFACESCALLBACK ddsfcb +) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->(0x%08lx,%p,%p,%p),stub!\n",This,x,ddsfd,context,ddsfcb); + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_Compact( LPDIRECTDRAW2 iface ) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->()\n", This ); + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_GetGDISurface( + LPDIRECTDRAW2 iface, LPDIRECTDRAWSURFACE *lplpGDIDDSSurface +) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->(%p)\n", This, lplpGDIDDSSurface); + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_GetScanLine( + LPDIRECTDRAW2 iface, LPDWORD lpdwScanLine +) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->(%p)\n", This, lpdwScanLine); + + if (lpdwScanLine) + *lpdwScanLine = 0; + return DD_OK; +} + +HRESULT WINAPI IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, GUID *lpGUID) { + ICOM_THIS(IDirectDraw2Impl,iface); + FIXME("(%p)->(%p)\n", This, lpGUID); + return DD_OK; +} + +/***************************************************************************** + * IDirectDraw2 + * + * We only need to list the changed/new functions. + */ +HRESULT WINAPI IDirectDraw2Impl_SetDisplayMode( + LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth, + DWORD dwRefreshRate, DWORD dwFlags +) { + FIXME("Ignoring parameters (0x%08lx,0x%08lx)\n", dwRefreshRate, dwFlags ); + return IDirectDrawImpl_SetDisplayMode((LPDIRECTDRAW)iface,width,height,depth); +} + +HRESULT WINAPI IDirectDraw2Impl_GetAvailableVidMem( + LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free +) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->(%p,%p,%p)\n", This,ddscaps,total,free); + + /* We have 16 MB videomemory */ + if (total) *total= 16*1024*1024; + if (free) *free = 16*1024*1024; + return DD_OK; +} + +/***************************************************************************** + * IDirectDraw4 + * + */ + +HRESULT WINAPI IDirectDraw4Impl_GetSurfaceFromDC( + LPDIRECTDRAW4 iface, HDC hdc, LPDIRECTDRAWSURFACE *lpDDS +) { + ICOM_THIS(IDirectDraw4Impl,iface); + FIXME("(%p)->(%08ld,%p)\n", This, (DWORD) hdc, lpDDS); + + return DD_OK; +} + +HRESULT WINAPI IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 iface) { + ICOM_THIS(IDirectDraw4Impl,iface); + FIXME("(%p)->()\n", This); + + return DD_OK; +} + +HRESULT WINAPI IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 iface) { + ICOM_THIS(IDirectDraw4Impl,iface); + FIXME("(%p)->()\n", This); + + return DD_OK; +} + +HRESULT WINAPI IDirectDraw4Impl_GetDeviceIdentifier( + LPDIRECTDRAW4 iface,LPDDDEVICEIDENTIFIER lpdddi,DWORD dwFlags +) { + ICOM_THIS(IDirectDraw4Impl,iface); + FIXME("(%p)->(%p,%08lx)\n", This, lpdddi, dwFlags); + + /* just guessing values */ + strcpy(lpdddi->szDriver,"directdraw"); + strcpy(lpdddi->szDescription,"WINE DirectDraw"); + lpdddi->liDriverVersion.s.HighPart = 7; + lpdddi->liDriverVersion.s.LowPart = 0; + /* Do I smell PCI ids here ? -MM */ + lpdddi->dwVendorId = 0; + lpdddi->dwDeviceId = 0; + lpdddi->dwSubSysId = 0; + lpdddi->dwRevision = 1; + memset(&(lpdddi->guidDeviceIdentifier),0,sizeof(lpdddi->guidDeviceIdentifier)); + return DD_OK; +} + +HRESULT common_off_screen_CreateSurface( + IDirectDraw2Impl* This,IDirectDrawSurfaceImpl* lpdsf +) { + int bpp; + + /* The surface was already allocated when entering in this function */ + TRACE("using system memory for a surface (%p) \n", lpdsf); + + if (lpdsf->s.surface_desc.dwFlags & DDSD_ZBUFFERBITDEPTH) { + /* This is a Z Buffer */ + TRACE("Creating Z-Buffer of %ld bit depth\n", lpdsf->s.surface_desc.u.dwZBufferBitDepth); + bpp = lpdsf->s.surface_desc.u.dwZBufferBitDepth / 8; + } else { + /* This is a standard image */ + if (!(lpdsf->s.surface_desc.dwFlags & DDSD_PIXELFORMAT)) { + /* No pixel format => use DirectDraw's format */ + lpdsf->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat; + lpdsf->s.surface_desc.dwFlags |= DDSD_PIXELFORMAT; + } + bpp = GET_BPP(lpdsf->s.surface_desc); + } + + if (lpdsf->s.surface_desc.dwFlags & DDSD_LPSURFACE) + ERR("Creates a surface that is already allocated : assuming this is an application bug !\n"); + + lpdsf->s.surface_desc.dwFlags |= DDSD_PITCH|DDSD_LPSURFACE; + lpdsf->s.surface_desc.u1.lpSurface =(LPBYTE)HeapAlloc( + GetProcessHeap(), + 0, + lpdsf->s.surface_desc.dwWidth * lpdsf->s.surface_desc.dwHeight * bpp + ); + lpdsf->s.surface_desc.lPitch = lpdsf->s.surface_desc.dwWidth * bpp; + return DD_OK; +} diff --git a/dlls/ddraw/ddraw/x11.c b/dlls/ddraw/ddraw/x11.c new file mode 100644 index 00000000000..92a3e84a067 --- /dev/null +++ b/dlls/ddraw/ddraw/x11.c @@ -0,0 +1,995 @@ +/* DirectDraw IDirectDraw Xlib interface + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff) + */ +/* + * This file contains the Xlib specific interface functions. + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "ddraw.h" +#include "d3d.h" +#include "win.h" +#include "debugtools.h" +#include "message.h" +#include "options.h" +#include "monitor.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#include "x11_private.h" + +#define DDPRIVATE(x) x11_dd_private *ddpriv = ((x11_dd_private*)(x)->private) +#define DPPRIVATE(x) x11_dp_private *dppriv = ((x11_dp_private*)(x)->private) +#define DSPRIVATE(x) x11_ds_private *dspriv = ((x11_ds_private*)(x)->private) + +static inline BOOL get_option( const char *name, BOOL def ) { + return PROFILE_GetWineIniBool( "x11drv", name, def ); +} + +int _common_depth_to_pixelformat( + DWORD depth, DDPIXELFORMAT *pixelformat,DDPIXELFORMAT *screen_pixelformat, + int *pix_depth +) { + XVisualInfo *vi; + XPixmapFormatValues *pf; + XVisualInfo vt; + int nvisuals, npixmap, i; + int match = 0; + int index = -2; + + vi = TSXGetVisualInfo(display, VisualNoMask, &vt, &nvisuals); + pf = XListPixmapFormats(display, &npixmap); + + for (i = 0; i < npixmap; i++) { + if (pf[i].depth == depth) { + int j; + + for (j = 0; j < nvisuals; j++) { + if (vi[j].depth == pf[i].depth) { + pixelformat->dwSize = sizeof(*pixelformat); + if (depth == 8) { + pixelformat->dwFlags = DDPF_PALETTEINDEXED8|DDPF_RGB; + pixelformat->u1.dwRBitMask = 0; + pixelformat->u2.dwGBitMask = 0; + pixelformat->u3.dwBBitMask = 0; + } else { + pixelformat->dwFlags = DDPF_RGB; + pixelformat->u1.dwRBitMask = vi[j].red_mask; + pixelformat->u2.dwGBitMask = vi[j].green_mask; + pixelformat->u3.dwBBitMask = vi[j].blue_mask; + } + pixelformat->dwFourCC = 0; + pixelformat->u.dwRGBBitCount = pf[i].bits_per_pixel; + pixelformat->u4.dwRGBAlphaBitMask= 0; + + *screen_pixelformat = *pixelformat; + + if (pix_depth) + *pix_depth = vi[j].depth; + + match = 1; + index = -1; + goto clean_up_and_exit; + } + } + ERR("No visual corresponding to pixmap format !\n"); + } + } + + if (match == 0) { + /* We try now to find an emulated mode */ + int c; + + for (c = 0; c < sizeof(ModeEmulations) / sizeof(Convert); c++) { + if (ModeEmulations[c].dest.depth == depth) { + /* Found an emulation function, now tries to find a matching visual / pixel format pair */ + for (i = 0; i < npixmap; i++) { + if ((pf[i].depth == ModeEmulations[c].screen.depth) && + (pf[i].bits_per_pixel == ModeEmulations[c].screen.bpp)) { + int j; + + for (j = 0; j < nvisuals; j++) { + if (vi[j].depth == pf[i].depth) { + screen_pixelformat->dwSize = sizeof(*screen_pixelformat); + screen_pixelformat->dwFlags = DDPF_RGB; + screen_pixelformat->dwFourCC = 0; + screen_pixelformat->u.dwRGBBitCount = pf[i].bits_per_pixel; + screen_pixelformat->u1.dwRBitMask = vi[j].red_mask; + screen_pixelformat->u2.dwGBitMask = vi[j].green_mask; + screen_pixelformat->u3.dwBBitMask = vi[j].blue_mask; + screen_pixelformat->u4.dwRGBAlphaBitMask= 0; + + pixelformat->dwSize = sizeof(*pixelformat); + pixelformat->dwFourCC = 0; + if (depth == 8) { + pixelformat->dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; + pixelformat->u.dwRGBBitCount = 8; + pixelformat->u1.dwRBitMask = 0; + pixelformat->u2.dwGBitMask = 0; + pixelformat->u3.dwBBitMask = 0; + } else { + pixelformat->dwFlags = DDPF_RGB; + pixelformat->u.dwRGBBitCount = ModeEmulations[c].dest.bpp; + pixelformat->u1.dwRBitMask = ModeEmulations[c].dest.rmask; + pixelformat->u2.dwGBitMask = ModeEmulations[c].dest.gmask; + pixelformat->u3.dwBBitMask = ModeEmulations[c].dest.bmask; + } + pixelformat->u4.dwRGBAlphaBitMask= 0; + + if (pix_depth) + *pix_depth = vi[j].depth; + + match = 2; + index = c; + goto clean_up_and_exit; + } + ERR("No visual corresponding to pixmap format !\n"); + } + } + } + } + } + } + +clean_up_and_exit: + TSXFree(vi); + TSXFree(pf); + + return index; +} + +/******************************************************************************* + * IDirectDraw + */ +#ifdef HAVE_LIBXXSHM +/* Error handlers for Image creation */ +static int XShmErrorHandler(Display *dpy, XErrorEvent *event) { + XShmErrorFlag = 1; + return 0; +} + +static XImage *create_xshmimage( + IDirectDraw2Impl* This, IDirectDrawSurface4Impl* lpdsf +) { + DSPRIVATE(lpdsf); + DDPRIVATE(This); + XImage *img; + int (*WineXHandler)(Display *, XErrorEvent *); + + img = TSXShmCreateImage(display, + DefaultVisualOfScreen(X11DRV_GetXScreen()), + This->d.pixmap_depth, + ZPixmap, + NULL, + &(dspriv->shminfo), + lpdsf->s.surface_desc.dwWidth, + lpdsf->s.surface_desc.dwHeight + ); + + if (img == NULL) { + FIXME("Couldn't create XShm image (due to X11 remote display or failure).\nReverting to standard X images !\n"); + ddpriv->xshm_active = 0; + return NULL; + } + + dspriv->shminfo.shmid = shmget( IPC_PRIVATE, img->bytes_per_line * img->height, IPC_CREAT|0777 ); + if (dspriv->shminfo.shmid < 0) { + FIXME("Couldn't create shared memory segment (due to X11 remote display or failure).\nReverting to standard X images !\n"); + ddpriv->xshm_active = 0; + TSXDestroyImage(img); + return NULL; + } + + dspriv->shminfo.shmaddr=img->data=(char*)shmat(dspriv->shminfo.shmid,0,0); + + if (img->data == (char *) -1) { + FIXME("Couldn't attach shared memory segment (due to X11 remote display or failure).\nReverting to standard X images !\n"); + ddpriv->xshm_active = 0; + TSXDestroyImage(img); + shmctl(dspriv->shminfo.shmid, IPC_RMID, 0); + return NULL; + } + dspriv->shminfo.readOnly = False; + + /* This is where things start to get trickier.... + * First, we flush the current X connections to be sure to catch all + * non-XShm related errors + */ + TSXSync(display, False); + /* Then we enter in the non-thread safe part of the tests */ + EnterCriticalSection( &X11DRV_CritSection ); + + /* Reset the error flag, sets our new error handler and try to attach + * the surface + */ + XShmErrorFlag = 0; + WineXHandler = XSetErrorHandler(XShmErrorHandler); + XShmAttach(display, &(dspriv->shminfo)); + XSync(display, False); + + /* Check the error flag */ + if (XShmErrorFlag) { + /* An error occured */ + XFlush(display); + XShmErrorFlag = 0; + XDestroyImage(img); + shmdt(dspriv->shminfo.shmaddr); + shmctl(dspriv->shminfo.shmid, IPC_RMID, 0); + XSetErrorHandler(WineXHandler); + + FIXME("Couldn't attach shared memory segment to X server (due to X11 remote display or failure).\nReverting to standard X images !\n"); + ddpriv->xshm_active = 0; + + /* Leave the critical section */ + LeaveCriticalSection( &X11DRV_CritSection ); + return NULL; + } + /* Here, to be REALLY sure, I should do a XShmPutImage to check if + * this works, but it may be a bit overkill.... + */ + XSetErrorHandler(WineXHandler); + LeaveCriticalSection( &X11DRV_CritSection ); + + shmctl(dspriv->shminfo.shmid, IPC_RMID, 0); + + if (This->d.pixel_convert != NULL) { + int bpp = PFGET_BPP(This->d.directdraw_pixelformat); + lpdsf->s.surface_desc.u1.lpSurface = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + lpdsf->s.surface_desc.dwWidth * + lpdsf->s.surface_desc.dwHeight * + bpp + ); + } else + lpdsf->s.surface_desc.u1.lpSurface = img->data; + return img; +} +#endif /* HAVE_LIBXXSHM */ + +static XImage *create_ximage(IDirectDraw2Impl* This, IDirectDrawSurface4Impl* lpdsf) { + XImage *img = NULL; + DDPRIVATE(This); + void *img_data; + int bpp = PFGET_BPP(This->d.directdraw_pixelformat); + +#ifdef HAVE_LIBXXSHM + if (ddpriv->xshm_active) + img = create_xshmimage(This, lpdsf); + + if (img == NULL) { +#endif + /* Allocate surface memory */ + lpdsf->s.surface_desc.u1.lpSurface = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + lpdsf->s.surface_desc.dwWidth * + lpdsf->s.surface_desc.dwHeight * + bpp + ); + + if (This->d.pixel_convert != NULL) + img_data = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + lpdsf->s.surface_desc.dwWidth * + lpdsf->s.surface_desc.dwHeight * + bpp + ); + else + img_data = lpdsf->s.surface_desc.u1.lpSurface; + + /* In this case, create an XImage */ + img = TSXCreateImage(display, + DefaultVisualOfScreen(X11DRV_GetXScreen()), + This->d.pixmap_depth, + ZPixmap, + 0, + img_data, + lpdsf->s.surface_desc.dwWidth, + lpdsf->s.surface_desc.dwHeight, + 32, + lpdsf->s.surface_desc.dwWidth*bpp + ); +#ifdef HAVE_LIBXXSHM + } +#endif + /* assert(bpp*lpdsf->s.surface_desc.dwWidth == img->bytes_per_line); */ + + if (This->d.pixel_convert != NULL) + lpdsf->s.surface_desc.lPitch = bpp*lpdsf->s.surface_desc.dwWidth; + else + lpdsf->s.surface_desc.lPitch = img->bytes_per_line; + return img; +} + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_CreateSurface( + LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf, + IUnknown *lpunk +) { + ICOM_THIS(IDirectDraw2Impl,iface); + IDirectDrawSurfaceImpl* dsurf; + x11_ds_private *dspriv; + + TRACE("(%p)->CreateSurface(%p,%p,%p)\n", This,lpddsd,lpdsf,lpunk); + + if (TRACE_ON(ddraw)) _dump_surface_desc(lpddsd); + + *lpdsf = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(IDirectDrawSurfaceImpl) + ); + dsurf = (IDirectDrawSurfaceImpl*)*lpdsf; + dsurf->ref = 2; + dsurf->private = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(x11_ds_private) + ); + ICOM_VTBL(dsurf) = (ICOM_VTABLE(IDirectDrawSurface)*)&xlib_dds4vt; + dspriv = (x11_ds_private*)dsurf->private; + + dsurf->s.ddraw = This; + IDirectDraw2_AddRef(iface); + + dsurf->s.palette = NULL; + dsurf->s.lpClipper = NULL; + dspriv->image = NULL; /* This is for off-screen buffers */ + + /* Copy the surface description */ + dsurf->s.surface_desc = *lpddsd; + + if (!(lpddsd->dwFlags & DDSD_WIDTH)) + dsurf->s.surface_desc.dwWidth = This->d.width; + if (!(lpddsd->dwFlags & DDSD_HEIGHT)) + dsurf->s.surface_desc.dwHeight = This->d.height; + dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT; + + /* Check if this a 'primary surface' or not */ + if ((lpddsd->dwFlags & DDSD_CAPS) && + (lpddsd->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + ) { + XImage *img; + + TRACE("using standard XImage for a primary surface (%p)\n", dsurf); + /* Create the XImage */ + img = create_ximage(This,(IDirectDrawSurface4Impl*)dsurf); + if (img == NULL) + return DDERR_OUTOFMEMORY; + dspriv->image = img; + + /* Add flags if there were not present */ + dsurf->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT; + dsurf->s.surface_desc.dwWidth = This->d.width; + dsurf->s.surface_desc.dwHeight = This->d.height; + dsurf->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY; + dsurf->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat; + + /* Check for backbuffers */ + if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) { + IDirectDrawSurface4Impl* back; + XImage *img; + int i; + + for (i=lpddsd->dwBackBufferCount;i--;) { + x11_ds_private *bspriv; + back = (IDirectDrawSurface4Impl*)HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(IDirectDrawSurface4Impl) + ); + TRACE("allocated back-buffer (%p)\n", back); + + IDirectDraw2_AddRef(iface); + back->s.ddraw = This; + + back->ref = 2; + ICOM_VTBL(back)=(ICOM_VTABLE(IDirectDrawSurface4)*)&xlib_dds4vt; + /* Copy the surface description from the front buffer */ + back->s.surface_desc = dsurf->s.surface_desc; + back->s.surface_desc.u1.lpSurface = NULL; + + back->private = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(x11_ds_private) + ); + bspriv = (x11_ds_private*)back->private; + + /* Create the XImage. */ + img = create_ximage(This, back); + if (img == NULL) + return DDERR_OUTOFMEMORY; + TRACE("bspriv = %p\n",bspriv); + bspriv->image = img; + + /* Add relevant info to front and back buffers */ + /* FIXME: backbuffer/frontbuffer handling broken here, but + * will be fixed up in _Flip(). + */ + SDDSCAPS(dsurf) |= DDSCAPS_FRONTBUFFER; + SDDSCAPS(back) |= DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP; + back->s.surface_desc.dwFlags &= ~DDSD_BACKBUFFERCOUNT; + SDDSCAPS(back) &= ~DDSCAPS_VISIBLE; + TRACE("attaching surface %p to %p\n",back,*lpdsf); + IDirectDrawSurface4_AddAttachedSurface((LPDIRECTDRAWSURFACE4)(*lpdsf),(LPDIRECTDRAWSURFACE4)back); + } + } + } else { + /* There is no Xlib-specific code here... + * Go to the common surface creation function + */ + return common_off_screen_CreateSurface(This,dsurf); + } + return DD_OK; +} + +/* + * The Xlib Implementation tries to use the passed hwnd as drawing window, + * even when the approbiate bitmasks are not specified. + */ +static HRESULT WINAPI Xlib_IDirectDraw2Impl_SetCooperativeLevel( + LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel +) { + ICOM_THIS(IDirectDraw2Impl,iface); + DDPRIVATE(This); + + FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel); + if (TRACE_ON(ddraw)) + _dump_cooperativelevel(cooplevel); + This->d.mainWindow = hwnd; + + /* This will be overwritten in the case of Full Screen mode. + Windowed games could work with that :-) */ + if (hwnd) { + WND *tmpWnd = WIN_FindWndPtr(hwnd); + ddpriv->drawable = X11DRV_WND_GetXWindow(tmpWnd); + WIN_ReleaseWndPtr(tmpWnd); + + if( !ddpriv->drawable ) { + ddpriv->drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window; + WIN_ReleaseDesktop(); + } + TRACE("Setting drawable to %ld\n", ddpriv->drawable); + } + return DD_OK; +} + +static HRESULT WINAPI Xlib_IDirectDrawImpl_SetDisplayMode( + LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth +) { + ICOM_THIS(IDirectDrawImpl,iface); + DDPRIVATE(This); + char buf[200]; + WND *tmpWnd; + int c; + + TRACE("(%p)->SetDisplayMode(%ld,%ld,%ld)\n", + This, width, height, depth); + + switch ((c = _common_depth_to_pixelformat(depth, + &(This->d.directdraw_pixelformat), + &(This->d.screen_pixelformat), + &(This->d.pixmap_depth)))) { + case -2: + sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width,height,depth); + MessageBoxA(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP); + return DDERR_UNSUPPORTEDMODE; + + case -1: + /* No convertion */ + This->d.pixel_convert = NULL; + This->d.palette_convert = NULL; + break; + + default: + DPRINTF("DirectDraw warning: running in depth-convertion mode. Should run using a %ld depth for optimal performances.\n", depth); + /* Set the depth convertion routines */ + This->d.pixel_convert = ModeEmulations[c].funcs.pixel_convert; + This->d.palette_convert = ModeEmulations[c].funcs.palette_convert; + } + + This->d.width = width; + This->d.height = height; + + _common_IDirectDrawImpl_SetDisplayMode(This); + + tmpWnd = WIN_FindWndPtr(This->d.window); + This->d.paintable = 1; + ddpriv->drawable = ((X11DRV_WND_DATA *) tmpWnd->pDriverData)->window; + WIN_ReleaseWndPtr(tmpWnd); + + /* We don't have a context for this window. Host off the desktop */ + if( !ddpriv->drawable ) + { + ddpriv->drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window; + WIN_ReleaseDesktop(); + } + TRACE("Setting drawable to %ld\n", ddpriv->drawable); + + if (get_option( "DXGrab", 0 )) { + /* Confine cursor movement (risky, but the user asked for it) */ + TSXGrabPointer(display, ddpriv->drawable, True, 0, GrabModeAsync, GrabModeAsync, ddpriv->drawable, None, CurrentTime); + } + + return DD_OK; +} + +static void fill_caps(LPDDCAPS caps) { + /* This function tries to fill the capabilities of Wine's DDraw implementation. + Need to be fixed, though.. */ + if (caps == NULL) + return; + + caps->dwSize = sizeof(*caps); + caps->dwCaps = DDCAPS_ALPHA | DDCAPS_BLT | DDCAPS_BLTSTRETCH | DDCAPS_BLTCOLORFILL | DDCAPS_BLTDEPTHFILL | DDCAPS_CANBLTSYSMEM | DDCAPS_COLORKEY | DDCAPS_PALETTE /*| DDCAPS_NOHARDWARE*/; + caps->dwCaps2 = DDCAPS2_CERTIFIED | DDCAPS2_NOPAGELOCKREQUIRED | DDCAPS2_WIDESURFACES; + caps->dwCKeyCaps = 0xFFFFFFFF; /* Should put real caps here one day... */ + caps->dwFXCaps = 0; + caps->dwFXAlphaCaps = 0; + caps->dwPalCaps = DDPCAPS_8BIT | DDPCAPS_ALLOW256; + caps->dwSVCaps = 0; + caps->dwZBufferBitDepths = DDBD_16; + /* I put here 8 Mo so that D3D applications will believe they have enough memory + to put textures in video memory. + BTW, is this only frame buffer memory or also texture memory (for Voodoo boards + for example) ? */ + caps->dwVidMemTotal = 8192 * 1024; + caps->dwVidMemFree = 8192 * 1024; + /* These are all the supported capabilities of the surfaces */ + caps->ddsCaps.dwCaps = DDSCAPS_ALPHA | DDSCAPS_BACKBUFFER | DDSCAPS_COMPLEX | DDSCAPS_FLIP | + DDSCAPS_FRONTBUFFER | DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM | DDSCAPS_OFFSCREENPLAIN | + /*DDSCAPS_OVERLAY |*/ DDSCAPS_PALETTE | DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY | + DDSCAPS_VIDEOMEMORY | DDSCAPS_VISIBLE; +#ifdef HAVE_MESAGL + caps->dwCaps |= DDCAPS_3D | DDCAPS_ZBLTS; + caps->dwCaps2 |= DDCAPS2_NO2DDURING3DSCENE; + caps->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE | DDSCAPS_MIPMAP | DDSCAPS_TEXTURE | DDSCAPS_ZBUFFER; +#endif +} + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetCaps( + LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2 +) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->GetCaps(%p,%p)\n",This,caps1,caps2); + + /* Put the same caps for the two capabilities */ + fill_caps(caps1); + fill_caps(caps2); + + return DD_OK; +} + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_CreatePalette( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent, + LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk +) { + ICOM_THIS(IDirectDraw2Impl,iface); + IDirectDrawPaletteImpl** ilpddpal=(IDirectDrawPaletteImpl**)lpddpal; + int xsize; + HRESULT res; + + TRACE("(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,ilpddpal,lpunk); + res = common_IDirectDraw2Impl_CreatePalette(This,dwFlags,palent,ilpddpal,lpunk,&xsize); + if (res != 0) + return res; + (*ilpddpal)->private = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(x11_dp_private) + ); + ICOM_VTBL(*ilpddpal) = &xlib_ddpalvt; + return DD_OK; +} + +static ULONG WINAPI Xlib_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + if (This->d.window && GetPropA(This->d.window,ddProp)) + DestroyWindow(This->d.window); + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + /* FIXME: destroy window ... */ + return This->ref; +} + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_QueryInterface( + LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj +) { + ICOM_THIS(IDirectDraw2Impl,iface); + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + if ( IsEqualGUID( &IID_IUnknown, refiid ) ) { + *obj = This; + IDirectDraw2_AddRef(iface); + + TRACE(" Creating IUnknown interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) { + ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_ddvt; + IDirectDraw2_AddRef(iface); + *obj = This; + + TRACE(" Creating IDirectDraw interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) { + ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd2vt; + IDirectDraw2_AddRef(iface); + *obj = This; + + TRACE(" Creating IDirectDraw2 interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) { + ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd4vt; + IDirectDraw2_AddRef(iface); + *obj = This; + + TRACE(" Creating IDirectDraw4 interface (%p)\n", *obj); + + return S_OK; + } +#ifdef HAVE_MESAGL + if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) + return create_direct3d(obj,This); + if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) + return create_direct3d2(obj,This); +#endif + FIXME("(%p):interface for IID %s _NOT_ found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_EnumDisplayModes( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb +) { + ICOM_THIS(IDirectDraw2Impl,iface); + XVisualInfo *vi; + XPixmapFormatValues *pf; + XVisualInfo vt; + int xbpp = 1, nvisuals, npixmap, i, emu; + int has_mode[] = { 0, 0, 0, 0 }; + int has_depth[] = { 8, 15, 16, 24 }; + DDSURFACEDESC ddsfd; + static struct { + int w,h; + } modes[] = { /* some of the usual modes */ + {512,384}, + {640,400}, + {640,480}, + {800,600}, + {1024,768}, + {1280,1024} + }; + DWORD maxWidth, maxHeight; + + TRACE("(%p)->(0x%08lx,%p,%p,%p)\n",This,dwFlags,lpddsfd,context,modescb); + ddsfd.dwSize = sizeof(ddsfd); + ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_CAPS|DDSD_PITCH; + if (dwFlags & DDEDM_REFRESHRATES) { + ddsfd.dwFlags |= DDSD_REFRESHRATE; + ddsfd.u.dwRefreshRate = 60; + } + maxWidth = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); + maxHeight = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); + + vi = TSXGetVisualInfo(display, VisualNoMask, &vt, &nvisuals); + pf = XListPixmapFormats(display, &npixmap); + + i = 0; + emu = 0; + while ((i < npixmap) || (emu != 4)) { + int mode_index = 0; + int send_mode = 0; + int j; + + if (i < npixmap) { + for (j = 0; j < 4; j++) { + if (has_depth[j] == pf[i].depth) { + mode_index = j; + break; + } + } + if (j == 4) { + i++; + continue; + } + + + if (has_mode[mode_index] == 0) { + if (mode_index == 0) { + send_mode = 1; + + ddsfd.ddsCaps.dwCaps = DDSCAPS_PALETTE; + ddsfd.ddpfPixelFormat.dwSize = sizeof(ddsfd.ddpfPixelFormat); + ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; + ddsfd.ddpfPixelFormat.dwFourCC = 0; + ddsfd.ddpfPixelFormat.u.dwRGBBitCount = 8; + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + + xbpp = 1; + + has_mode[mode_index] = 1; + } else { + /* All the 'true color' depths (15, 16 and 24) + First, find the corresponding visual to extract the bit masks */ + for (j = 0; j < nvisuals; j++) { + if (vi[j].depth == pf[i].depth) { + ddsfd.ddsCaps.dwCaps = 0; + ddsfd.ddpfPixelFormat.dwSize = sizeof(ddsfd.ddpfPixelFormat); + ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB; + ddsfd.ddpfPixelFormat.dwFourCC = 0; + ddsfd.ddpfPixelFormat.u.dwRGBBitCount = pf[i].bits_per_pixel; + ddsfd.ddpfPixelFormat.u1.dwRBitMask = vi[j].red_mask; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = vi[j].green_mask; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = vi[j].blue_mask; + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + + xbpp = pf[i].bits_per_pixel/8; + + send_mode = 1; + has_mode[mode_index] = 1; + break; + } + } + if (j == nvisuals) + ERR("Did not find visual corresponding the the pixmap format !\n"); + } + } + i++; + } else { + /* Now to emulated modes */ + if (has_mode[emu] == 0) { + int c; + int l; + int depth = has_depth[emu]; + + for (c = 0; (c < sizeof(ModeEmulations) / sizeof(Convert)) && (send_mode == 0); c++) { + if (ModeEmulations[c].dest.depth == depth) { + /* Found an emulation function, now tries to find a matching visual / pixel format pair */ + for (l = 0; (l < npixmap) && (send_mode == 0); l++) { + if ((pf[l].depth == ModeEmulations[c].screen.depth) && + (pf[l].bits_per_pixel == ModeEmulations[c].screen.bpp)) { + int j; + for (j = 0; (j < nvisuals) && (send_mode == 0); j++) { + if ((vi[j].depth == pf[l].depth) && + (vi[j].red_mask == ModeEmulations[c].screen.rmask) && + (vi[j].green_mask == ModeEmulations[c].screen.gmask) && + (vi[j].blue_mask == ModeEmulations[c].screen.bmask)) { + ddsfd.ddpfPixelFormat.dwSize = sizeof(ddsfd.ddpfPixelFormat); + ddsfd.ddpfPixelFormat.dwFourCC = 0; + if (depth == 8) { + ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; + ddsfd.ddpfPixelFormat.u.dwRGBBitCount = 8; + ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; + } else { + ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB; + ddsfd.ddpfPixelFormat.u.dwRGBBitCount = ModeEmulations[c].dest.bpp; + ddsfd.ddpfPixelFormat.u1.dwRBitMask = ModeEmulations[c].dest.rmask; + ddsfd.ddpfPixelFormat.u2.dwGBitMask = ModeEmulations[c].dest.gmask; + ddsfd.ddpfPixelFormat.u3.dwBBitMask = ModeEmulations[c].dest.bmask; + } + ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; + send_mode = 1; + } + + if (send_mode == 0) + ERR("No visual corresponding to pixmap format !\n"); + } + } + } + } + } + } + + emu++; + } + + if (send_mode) { + int mode; + + if (TRACE_ON(ddraw)) { + TRACE("Enumerating with pixel format : \n"); + _dump_pixelformat(&(ddsfd.ddpfPixelFormat)); + DPRINTF("\n"); + } + + for (mode = 0; mode < sizeof(modes)/sizeof(modes[0]); mode++) { + /* Do not enumerate modes we cannot handle anyway */ + if ((modes[mode].w > maxWidth) || (modes[mode].h > maxHeight)) + break; + + ddsfd.dwWidth = modes[mode].w; + ddsfd.dwHeight= modes[mode].h; + ddsfd.lPitch = ddsfd.dwWidth * xbpp; + + /* Now, send the mode description to the application */ + TRACE(" - mode %4ld - %4ld\n", ddsfd.dwWidth, ddsfd.dwHeight); + if (!modescb(&ddsfd, context)) + goto exit_enum; + } + + if (!(dwFlags & DDEDM_STANDARDVGAMODES)) { + /* modeX is not standard VGA */ + ddsfd.dwWidth = 320; + ddsfd.dwHeight = 200; + ddsfd.lPitch = 320 * xbpp; + if (!modescb(&ddsfd, context)) + goto exit_enum; + } + } + } + exit_enum: + TSXFree(vi); + TSXFree(pf); + + return DD_OK; +} + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetDisplayMode( + LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsfd +) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->GetDisplayMode(%p)\n",This,lpddsfd); + lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; + lpddsfd->dwHeight = This->d.height; + lpddsfd->dwWidth = This->d.width; + lpddsfd->lPitch = lpddsfd->dwWidth * PFGET_BPP(This->d.directdraw_pixelformat); + lpddsfd->dwBackBufferCount = 2; + lpddsfd->u.dwRefreshRate = 60; + lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE; + lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat; + if (TRACE_ON(ddraw)) + _dump_surface_desc(lpddsfd); + return DD_OK; +} + +/* Note: Hack so we can reuse the old functions without compiler warnings */ +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(xlib_ddvt.fn##fun)) +#else +# define XCAST(fun) (void *) +#endif + +ICOM_VTABLE(IDirectDraw) xlib_ddvt = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface, + XCAST(AddRef)IDirectDraw2Impl_AddRef, + XCAST(Release)Xlib_IDirectDraw2Impl_Release, + XCAST(Compact)IDirectDraw2Impl_Compact, + XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, + XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette, + XCAST(CreateSurface)Xlib_IDirectDraw2Impl_CreateSurface, + XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, + XCAST(EnumDisplayModes)Xlib_IDirectDraw2Impl_EnumDisplayModes, + XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, + XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, + XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps, + XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode, + XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, + XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, + XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, + XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, + XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, + XCAST(Initialize)IDirectDraw2Impl_Initialize, + XCAST(RestoreDisplayMode)IDirectDraw2Impl_RestoreDisplayMode, + XCAST(SetCooperativeLevel)Xlib_IDirectDraw2Impl_SetCooperativeLevel, + Xlib_IDirectDrawImpl_SetDisplayMode, + XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, +}; + +#undef XCAST + +/***************************************************************************** + * IDirectDraw2 + * + */ + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_SetDisplayMode( + LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth,DWORD dwRefreshRate,DWORD dwFlags +) { + FIXME( "Ignored parameters (0x%08lx,0x%08lx)\n", dwRefreshRate, dwFlags ); + return Xlib_IDirectDrawImpl_SetDisplayMode((LPDIRECTDRAW)iface,width,height,depth); +} + +static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetAvailableVidMem( + LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free +) { + ICOM_THIS(IDirectDraw2Impl,iface); + TRACE("(%p)->(%p,%p,%p)\n",This,ddscaps,total,free); + if (total) *total = 16* 1024 * 1024; + if (free) *free = 16* 1024 * 1024; + return DD_OK; +} + +ICOM_VTABLE(IDirectDraw2) xlib_dd2vt = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + Xlib_IDirectDraw2Impl_QueryInterface, + IDirectDraw2Impl_AddRef, + Xlib_IDirectDraw2Impl_Release, + IDirectDraw2Impl_Compact, + IDirectDraw2Impl_CreateClipper, + Xlib_IDirectDraw2Impl_CreatePalette, + Xlib_IDirectDraw2Impl_CreateSurface, + IDirectDraw2Impl_DuplicateSurface, + Xlib_IDirectDraw2Impl_EnumDisplayModes, + IDirectDraw2Impl_EnumSurfaces, + IDirectDraw2Impl_FlipToGDISurface, + Xlib_IDirectDraw2Impl_GetCaps, + Xlib_IDirectDraw2Impl_GetDisplayMode, + IDirectDraw2Impl_GetFourCCCodes, + IDirectDraw2Impl_GetGDISurface, + IDirectDraw2Impl_GetMonitorFrequency, + IDirectDraw2Impl_GetScanLine, + IDirectDraw2Impl_GetVerticalBlankStatus, + IDirectDraw2Impl_Initialize, + IDirectDraw2Impl_RestoreDisplayMode, + Xlib_IDirectDraw2Impl_SetCooperativeLevel, + Xlib_IDirectDraw2Impl_SetDisplayMode, + IDirectDraw2Impl_WaitForVerticalBlank, + Xlib_IDirectDraw2Impl_GetAvailableVidMem +}; + +#if !defined(__STRICT_ANSI__) && defined(__GNUC__) +# define XCAST(fun) (typeof(xlib_dd4vt.fn##fun)) +#else +# define XCAST(fun) (void*) +#endif + +ICOM_VTABLE(IDirectDraw4) xlib_dd4vt = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface, + XCAST(AddRef)IDirectDraw2Impl_AddRef, + XCAST(Release)Xlib_IDirectDraw2Impl_Release, + XCAST(Compact)IDirectDraw2Impl_Compact, + XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, + XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette, + XCAST(CreateSurface)Xlib_IDirectDraw2Impl_CreateSurface, + XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, + XCAST(EnumDisplayModes)Xlib_IDirectDraw2Impl_EnumDisplayModes, + XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, + XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, + XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps, + XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode, + XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, + XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, + XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, + XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, + XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, + XCAST(Initialize)IDirectDraw2Impl_Initialize, + XCAST(RestoreDisplayMode)IDirectDraw2Impl_RestoreDisplayMode, + XCAST(SetCooperativeLevel)Xlib_IDirectDraw2Impl_SetCooperativeLevel, + XCAST(SetDisplayMode)Xlib_IDirectDrawImpl_SetDisplayMode, + XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, + XCAST(GetAvailableVidMem)Xlib_IDirectDraw2Impl_GetAvailableVidMem, + IDirectDraw4Impl_GetSurfaceFromDC, + IDirectDraw4Impl_RestoreAllSurfaces, + IDirectDraw4Impl_TestCooperativeLevel, + IDirectDraw4Impl_GetDeviceIdentifier +}; +#undef XCAST diff --git a/dlls/ddraw/ddraw_main.c b/dlls/ddraw/ddraw_main.c deleted file mode 100644 index 89f9caab6b6..00000000000 --- a/dlls/ddraw/ddraw_main.c +++ /dev/null @@ -1,5803 +0,0 @@ -/* DirectDraw using DGA or Xlib(XSHM) - * - * Copyright 1997-1999 Marcus Meissner - * Copyright 1998 Lionel Ulmer (most of Direct3D stuff) - */ -/* XF86DGA: - * When DirectVideo mode is enabled you can no longer use 'normal' X - * applications nor can you switch to a virtual console. Also, enabling - * only works, if you have switched to the screen where the application - * is running. - * Some ways to debug this stuff are: - * - A terminal connected to the serial port. Can be bought used for cheap. - * (This is the method I am using.) - * - Another machine connected over some kind of network. - */ - -#include "config.h" -#include "winerror.h" - -#ifndef X_DISPLAY_MISSING - -#include "ts_xlib.h" -#include "ts_xutil.h" - -#ifdef HAVE_LIBXXSHM -# include -# ifdef HAVE_SYS_IPC_H -# include -# endif -# ifdef HAVE_SYS_SHM_H -# include -# endif -# include "ts_xshm.h" -#endif /* defined(HAVE_LIBXXSHM) */ - -#ifdef HAVE_LIBXXF86DGA -#include "ts_xf86dga.h" -#endif /* defined(HAVE_LIBXXF86DGA) */ - -#ifdef HAVE_LIBXXF86DGA2 -#include "ts_xf86dga2.h" -#endif /* defined(HAVE_LIBXXF86DGA2) */ - -#ifdef HAVE_LIBXXF86VM -#include "ts_xf86vmode.h" -#endif /* defined(HAVE_LIBXXF86VM) */ - -#include "x11drv.h" - -#include -#include -#ifdef HAVE_SYS_SIGNAL_H -# include -#endif -#include -#include -#include -#include - -#include "gdi.h" -#include "heap.h" -#include "dc.h" -#include "win.h" -#include "wine/exception.h" -#include "ddraw.h" -#include "d3d.h" -#include "debugtools.h" -#include "spy.h" -#include "message.h" -#include "options.h" -#include "monitor.h" - -static char *ddProp = "WINE_DDRAW_Property"; - -/* This for all the enumeration and creation of D3D-related objects */ -#include "ddraw_private.h" -#include "d3d_private.h" - -DEFAULT_DEBUG_CHANNEL(ddraw); - -/* Restore signal handlers overwritten by XF86DGA - */ -#define RESTORE_SIGNALS - -/* Get DDSCAPS of surface (shortcutmacro) */ -#define SDDSCAPS(iface) ((iface)->s.surface_desc.ddsCaps.dwCaps) - -/* Get the number of bytes per pixel for a given surface */ -#define PFGET_BPP(pf) (pf.dwFlags&DDPF_PALETTEINDEXED8?1:(pf.u.dwRGBBitCount/8)) - -#define GET_BPP(desc) PFGET_BPP(desc.ddpfPixelFormat) - -/* Where do these GUIDs come from? mkuuid. - * They exist solely to distinguish between the targets Wine support, - * and should be different than any other GUIDs in existence. - */ -static GUID DGA_DirectDraw_GUID = { /* e2dcb020-dc60-11d1-8407-9714f5d50802 */ - 0xe2dcb020, - 0xdc60, - 0x11d1, - {0x84, 0x07, 0x97, 0x14, 0xf5, 0xd5, 0x08, 0x02} -}; - -static GUID XLIB_DirectDraw_GUID = { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */ - 0x1574a740, - 0xdc61, - 0x11d1, - {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79} -}; - -#ifdef HAVE_LIBXXF86DGA -static struct ICOM_VTABLE(IDirectDrawSurface4) dga_dds4vt; -static struct ICOM_VTABLE(IDirectDraw) dga_ddvt; -static struct ICOM_VTABLE(IDirectDraw2) dga_dd2vt; -static struct ICOM_VTABLE(IDirectDraw4) dga_dd4vt; -static struct ICOM_VTABLE(IDirectDrawPalette) dga_ddpalvt; -#endif /* defined(HAVE_LIBXXF86DGA) */ - -#ifdef HAVE_LIBXXF86DGA2 -static struct ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt; -#endif /* defined(HAVE_LIBXXF86DGA2) */ - -static struct ICOM_VTABLE(IDirectDrawSurface4) xlib_dds4vt; -static struct ICOM_VTABLE(IDirectDraw) xlib_ddvt; -static struct ICOM_VTABLE(IDirectDraw2) xlib_dd2vt; -static struct ICOM_VTABLE(IDirectDraw4) xlib_dd4vt; -static struct ICOM_VTABLE(IDirectDrawPalette) xlib_ddpalvt; - -static struct ICOM_VTABLE(IDirectDrawClipper) ddclipvt; -static struct ICOM_VTABLE(IDirect3D) d3dvt; -static struct ICOM_VTABLE(IDirect3D2) d3d2vt; - -/* This is for mode-emulation */ - -static void pixel_convert_16_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) ; -static void palette_convert_16_to_8(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count) ; -static void palette_convert_15_to_8(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count) ; -static void pixel_convert_24_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) ; -static void pixel_convert_32_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) ; -static void palette_convert_24_to_8(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count) ; -static void pixel_convert_32_to_16(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) ; - -typedef struct { - unsigned short bpp; - unsigned short depth; - unsigned int rmask; - unsigned int gmask; - unsigned int bmask; -} ConvertMode; - -typedef struct { - void (*pixel_convert)(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette); - void (*palette_convert)(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count); -} ConvertFuncs; - -typedef struct { - ConvertMode screen, dest; - ConvertFuncs funcs; -} Convert; - -static Convert ModeEmulations[] = { - { { 32, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_32_to_8, palette_convert_24_to_8 } }, - { { 32, 24, 0x00FF0000, 0x0000FF00, 0x000000FF }, { 16, 16, 0xF800, 0x07E0, 0x001F }, { pixel_convert_32_to_16, NULL } }, - { { 24, 24, 0xFF0000, 0x00FF00, 0x0000FF }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_24_to_8, palette_convert_24_to_8 } }, - { { 16, 16, 0xF800, 0x07E0, 0x001F }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_16_to_8, palette_convert_16_to_8 } }, - { { 16, 15, 0x7C00, 0x03E0, 0x001F }, { 8, 8, 0x00, 0x00, 0x00 }, { pixel_convert_16_to_8, palette_convert_15_to_8 } }, -}; - -#ifdef HAVE_LIBXXF86VM -static XF86VidModeModeInfo *orig_mode = NULL; -#endif - -#ifdef HAVE_LIBXXSHM -static int XShmErrorFlag = 0; -#endif - -static inline BOOL get_option( const char *name, BOOL def ) -{ - return PROFILE_GetWineIniBool( "x11drv", name, def ); -} - -static BYTE -DDRAW_DGA_Available(void) -{ -#ifdef HAVE_LIBXXF86DGA - int fd, evbase, evret, majver, minver; - static BYTE return_value = 0xFF; - - /* This prevents from probing X times for DGA */ - if (return_value != 0xFF) - return return_value; - - if (!get_option( "UseDGA", 1 )) { - return_value = 0; - return 0; - } - - /* First, query the extenstion and its version */ - if (!TSXF86DGAQueryExtension(display,&evbase,&evret)) { - return_value = 0; - return 0; - } - - if (!TSXF86DGAQueryVersion(display,&majver,&minver)) { - return_value = 0; - return 0; - } - -#ifdef HAVE_LIBXXF86DGA2 - if (majver >= 2) { - /* We have DGA 2.0 available ! */ - if (TSXDGAOpenFramebuffer(display, DefaultScreen(display))) { - TSXDGACloseFramebuffer(display, DefaultScreen(display)); - return_value = 2; - } else { - return_value = 0; - } - - return return_value; - } else { -#endif /* defined(HAVE_LIBXXF86DGA2) */ - - /* You don't have to be root to use DGA extensions. Simply having access to /dev/mem will do the trick */ - /* This can be achieved by adding the user to the "kmem" group on Debian 2.x systems, don't know about */ - /* others. --stephenc */ - if ((fd = open("/dev/mem", O_RDWR)) != -1) - close(fd); - - if (fd != -1) - return_value = 1; - else - return_value = 0; - - return return_value; -#ifdef HAVE_LIBXXF86DGA2 - } -#endif /* defined(HAVE_LIBXXF86DGA2) */ -#else /* defined(HAVE_LIBXXF86DGA) */ - return 0; -#endif /* defined(HAVE_LIBXXF86DGA) */ -} - -/**********************************************************************/ - -typedef struct { - LPVOID lpCallback; - LPVOID lpContext; -} DirectDrawEnumerateProcData; - -/*********************************************************************** - * DirectDrawEnumerateExA (DDRAW.*) - */ -HRESULT WINAPI DirectDrawEnumerateExA( - LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) -{ - TRACE("(%p,%p, %08lx)\n", lpCallback, lpContext, dwFlags); - - if (TRACE_ON(ddraw)) { - DPRINTF(" Flags : "); - if (dwFlags & DDENUM_ATTACHEDSECONDARYDEVICES) - DPRINTF("DDENUM_ATTACHEDSECONDARYDEVICES "); - if (dwFlags & DDENUM_DETACHEDSECONDARYDEVICES) - DPRINTF("DDENUM_DETACHEDSECONDARYDEVICES "); - if (dwFlags & DDENUM_NONDISPLAYDEVICES) - DPRINTF("DDENUM_NONDISPLAYDEVICES "); - DPRINTF("\n"); - } - - if (dwFlags == DDENUM_NONDISPLAYDEVICES) { - /* For the moment, Wine does not support any 3D only accelerators */ - return DD_OK; - } - if (dwFlags == DDENUM_NONDISPLAYDEVICES) { - /* For the moment, Wine does not support any attached secondary devices */ - return DD_OK; - } - - if (DDRAW_DGA_Available()) { - TRACE("Enumerating DGA interface\n"); - if (!lpCallback(&DGA_DirectDraw_GUID, "WINE with XFree86 DGA", "display", lpContext, 0)) - return DD_OK; - } - - TRACE("Enumerating Xlib interface\n"); - if (!lpCallback(&XLIB_DirectDraw_GUID, "WINE with Xlib", "display", lpContext, 0)) - return DD_OK; - - TRACE("Enumerating Default interface\n"); - if (!lpCallback(NULL,"WINE (default)", "display", lpContext, 0)) - return DD_OK; - - return DD_OK; -} - -/*********************************************************************** - * DirectDrawEnumerateExW (DDRAW.*) - */ - -static BOOL CALLBACK DirectDrawEnumerateExProcW( - GUID *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, - LPVOID lpContext, HMONITOR hm) -{ - DirectDrawEnumerateProcData *pEPD = - (DirectDrawEnumerateProcData *) lpContext; - LPWSTR lpDriverDescriptionW = - HEAP_strdupAtoW(GetProcessHeap(), 0, lpDriverDescription); - LPWSTR lpDriverNameW = - HEAP_strdupAtoW(GetProcessHeap(), 0, lpDriverName); - - BOOL bResult = (*(LPDDENUMCALLBACKEXW *) pEPD->lpCallback)( - lpGUID, lpDriverDescriptionW, lpDriverNameW, pEPD->lpContext, hm); - - HeapFree(GetProcessHeap(), 0, lpDriverDescriptionW); - HeapFree(GetProcessHeap(), 0, lpDriverNameW); - - return bResult; -} - -/**********************************************************************/ - -HRESULT WINAPI DirectDrawEnumerateExW( - LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) -{ - DirectDrawEnumerateProcData epd; - epd.lpCallback = (LPVOID) lpCallback; - epd.lpContext = lpContext; - - return DirectDrawEnumerateExA(DirectDrawEnumerateExProcW, - (LPVOID) &epd, 0); -} - -/*********************************************************************** - * DirectDrawEnumerateA (DDRAW.*) - */ - -static BOOL CALLBACK DirectDrawEnumerateProcA( - GUID *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, - LPVOID lpContext, HMONITOR hm) -{ - DirectDrawEnumerateProcData *pEPD = - (DirectDrawEnumerateProcData *) lpContext; - - return ((LPDDENUMCALLBACKA) pEPD->lpCallback)( - lpGUID, lpDriverDescription, lpDriverName, pEPD->lpContext); -} - -/**********************************************************************/ - -HRESULT WINAPI DirectDrawEnumerateA( - LPDDENUMCALLBACKA lpCallback, LPVOID lpContext) -{ - DirectDrawEnumerateProcData epd; - epd.lpCallback = (LPVOID) lpCallback; - epd.lpContext = lpContext; - - return DirectDrawEnumerateExA(DirectDrawEnumerateProcA, - (LPVOID) &epd, 0); -} - -/*********************************************************************** - * DirectDrawEnumerateW (DDRAW.*) - */ - -static BOOL WINAPI DirectDrawEnumerateProcW( - GUID *lpGUID, LPWSTR lpDriverDescription, LPWSTR lpDriverName, - LPVOID lpContext, HMONITOR hm) -{ - DirectDrawEnumerateProcData *pEPD = - (DirectDrawEnumerateProcData *) lpContext; - - return ((LPDDENUMCALLBACKW) pEPD->lpCallback)( - lpGUID, lpDriverDescription, lpDriverName, - pEPD->lpContext); -} - -/**********************************************************************/ - -HRESULT WINAPI DirectDrawEnumerateW( - LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) -{ - DirectDrawEnumerateProcData epd; - epd.lpCallback = (LPVOID) lpCallback; - epd.lpContext = lpContext; - - return DirectDrawEnumerateExW(DirectDrawEnumerateProcW, - (LPVOID) &epd, 0); -} - -/*********************************************************************** - * DSoundHelp (DDRAW.?) - */ - -/* What is this doing here? */ -HRESULT WINAPI -DSoundHelp(DWORD x,DWORD y,DWORD z) { - FIXME("(0x%08lx,0x%08lx,0x%08lx),stub!\n",x,y,z); - return 0; -} - -/****************************************************************************** - * internal helper functions - */ -static void _dump_DDBLTFX(DWORD flagmask) { - int i; - const struct { - DWORD mask; - char *name; - } flags[] = { -#define FE(x) { x, #x}, - FE(DDBLTFX_ARITHSTRETCHY) - FE(DDBLTFX_MIRRORLEFTRIGHT) - FE(DDBLTFX_MIRRORUPDOWN) - FE(DDBLTFX_NOTEARING) - FE(DDBLTFX_ROTATE180) - FE(DDBLTFX_ROTATE270) - FE(DDBLTFX_ROTATE90) - FE(DDBLTFX_ZBUFFERRANGE) - FE(DDBLTFX_ZBUFFERBASEDEST) -#undef FE - }; - for (i=0;idwFlags); - if (pf->dwFlags & DDPF_FOURCC) { - DPRINTF(", dwFourCC : %ld", pf->dwFourCC); - } - if (pf->dwFlags & DDPF_RGB) { - DPRINTF(", RGB bits: %ld, ", pf->u.dwRGBBitCount); - switch (pf->u.dwRGBBitCount) { - case 4: - cmd = "%1lx"; - break; - case 8: - cmd = "%02lx"; - break; - case 16: - cmd = "%04lx"; - break; - case 24: - cmd = "%06lx"; - break; - case 32: - cmd = "%08lx"; - break; - default: - ERR("Unexpected bit depth !\n"); - cmd = "%d"; - } - DPRINTF(" R "); DPRINTF(cmd, pf->u1.dwRBitMask); - DPRINTF(" G "); DPRINTF(cmd, pf->u2.dwGBitMask); - DPRINTF(" B "); DPRINTF(cmd, pf->u3.dwBBitMask); - if (pf->dwFlags & DDPF_ALPHAPIXELS) { - DPRINTF(" A "); DPRINTF(cmd, pf->u4.dwRGBAlphaBitMask); - } - if (pf->dwFlags & DDPF_ZPIXELS) { - DPRINTF(" Z "); DPRINTF(cmd, pf->u4.dwRGBZBitMask); -} - } - if (pf->dwFlags & DDPF_ZBUFFER) { - DPRINTF(", Z bits : %ld", pf->u.dwZBufferBitDepth); - } - if (pf->dwFlags & DDPF_ALPHA) { - DPRINTF(", Alpha bits : %ld", pf->u.dwAlphaBitDepth); - } - DPRINTF(")"); -} - -static void _dump_colorkeyflag(DWORD ck) { - int i; - const struct { - DWORD mask; - char *name; - } flags[] = { -#define FE(x) { x, #x}, - FE(DDCKEY_COLORSPACE) - FE(DDCKEY_DESTBLT) - FE(DDCKEY_DESTOVERLAY) - FE(DDCKEY_SRCBLT) - FE(DDCKEY_SRCOVERLAY) -#undef FE - }; - for (i=0;idwColorSpaceLowValue, ddck->dwColorSpaceHighValue); -} - -static void _dump_surface_desc(DDSURFACEDESC *lpddsd) { - int i; - struct { - DWORD mask; - char *name; - void (*func)(void *); - void *elt; - } flags[16], *fe = flags; -#define FE(x,f,e) do { fe->mask = x; fe->name = #x; fe->func = f; fe->elt = (void *) &(lpddsd->e); fe++; } while(0) - FE(DDSD_CAPS, _dump_DDSCAPS, ddsCaps); - FE(DDSD_HEIGHT, _dump_DWORD, dwHeight); - FE(DDSD_WIDTH, _dump_DWORD, dwWidth); - FE(DDSD_PITCH, _dump_DWORD, lPitch); - FE(DDSD_BACKBUFFERCOUNT, _dump_DWORD, dwBackBufferCount); - FE(DDSD_ZBUFFERBITDEPTH, _dump_DWORD, u.dwZBufferBitDepth); - FE(DDSD_ALPHABITDEPTH, _dump_DWORD, dwAlphaBitDepth); - FE(DDSD_PIXELFORMAT, _dump_pixelformat, ddpfPixelFormat); - FE(DDSD_CKDESTOVERLAY, _dump_DDCOLORKEY, ddckCKDestOverlay); - FE(DDSD_CKDESTBLT, _dump_DDCOLORKEY, ddckCKDestBlt); - FE(DDSD_CKSRCOVERLAY, _dump_DDCOLORKEY, ddckCKSrcOverlay); - FE(DDSD_CKSRCBLT, _dump_DDCOLORKEY, ddckCKSrcBlt); - FE(DDSD_MIPMAPCOUNT, _dump_DWORD, u.dwMipMapCount); - FE(DDSD_REFRESHRATE, _dump_DWORD, u.dwRefreshRate); - FE(DDSD_LINEARSIZE, _dump_DWORD, u1.dwLinearSize); - FE(DDSD_LPSURFACE, _dump_PTR, u1.lpSurface); -#undef FE - - for (i=0;idwFlags) { - DPRINTF(" - %s : ",flags[i].name); - flags[i].func(flags[i].elt); - DPRINTF("\n"); -} -} - - -/****************************************************************************** - * IDirectDrawSurface methods - * - * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let - * DDS and DDS2 use those functions. (Function calls did not change (except - * using different DirectDrawSurfaceX version), just added flags and functions) - */ - -static HRESULT WINAPI IDirectDrawSurface4Impl_Lock( - LPDIRECTDRAWSURFACE4 iface,LPRECT lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE hnd -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->Lock(%p,%p,%08lx,%08lx)\n", - This,lprect,lpddsd,flags,(DWORD)hnd); - if (flags & ~(DDLOCK_WAIT|DDLOCK_READONLY|DDLOCK_WRITEONLY)) - WARN("(%p)->Lock(%p,%p,%08lx,%08lx)\n", - This,lprect,lpddsd,flags,(DWORD)hnd); - - /* First, copy the Surface description */ - *lpddsd = This->s.surface_desc; - TRACE("locked surface: height=%ld, width=%ld, pitch=%ld\n", - lpddsd->dwHeight,lpddsd->dwWidth,lpddsd->lPitch); - - /* If asked only for a part, change the surface pointer */ - if (lprect) { - TRACE(" lprect: %dx%d-%dx%d\n", - lprect->top,lprect->left,lprect->bottom,lprect->right - ); - if ((lprect->top < 0) || - (lprect->left < 0) || - (lprect->bottom < 0) || - (lprect->right < 0)) { - ERR(" Negative values in LPRECT !!!\n"); - return DDERR_INVALIDPARAMS; - } - - lpddsd->u1.lpSurface = (LPVOID) ((char *) This->s.surface_desc.u1.lpSurface + - (lprect->top*This->s.surface_desc.lPitch) + - lprect->left*GET_BPP(This->s.surface_desc)); - } else { - assert(This->s.surface_desc.u1.lpSurface); - } - - /* wait for any previous operations to complete */ -#ifdef HAVE_LIBXXSHM - if (This->t.xlib.image && (SDDSCAPS(This) & DDSCAPS_VISIBLE) && - This->s.ddraw->e.xlib.xshm_active) { -/* - int compl = InterlockedExchange( &This->s.ddraw->e.xlib.xshm_compl, 0 ); - if (compl) X11DRV_EVENT_WaitShmCompletion( compl ); -*/ - X11DRV_EVENT_WaitShmCompletions( This->s.ddraw->d.drawable ); - } -#endif - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDrawSurface4Impl_Unlock( - LPDIRECTDRAWSURFACE4 iface,LPVOID surface -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->Unlock(%p)\n",This,surface); - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static void Xlib_copy_surface_on_screen(IDirectDrawSurface4Impl* This) { - if (This->s.ddraw->d.pixel_convert != NULL) - This->s.ddraw->d.pixel_convert(This->s.surface_desc.u1.lpSurface, - This->t.xlib.image->data, - This->s.surface_desc.dwWidth, - This->s.surface_desc.dwHeight, - This->s.surface_desc.lPitch, - This->s.palette); - -#ifdef HAVE_LIBXXSHM - if (This->s.ddraw->e.xlib.xshm_active) { -/* - X11DRV_EVENT_WaitReplaceShmCompletion( &This->s.ddraw->e.xlib.xshm_compl, This->s.ddraw->d.drawable ); -*/ - /* let WaitShmCompletions track 'em for now */ - /* (you may want to track it again whenever you implement DX7's partial surface locking, - where threads have concurrent access) */ - X11DRV_EVENT_PrepareShmCompletion( This->s.ddraw->d.drawable ); - TSXShmPutImage(display, - This->s.ddraw->d.drawable, - DefaultGCOfScreen(X11DRV_GetXScreen()), - This->t.xlib.image, - 0, 0, 0, 0, - This->t.xlib.image->width, - This->t.xlib.image->height, - True); - /* make sure the image is transferred ASAP */ - TSXFlush(display); - } - else -#endif - TSXPutImage( display, - This->s.ddraw->d.drawable, - DefaultGCOfScreen(X11DRV_GetXScreen()), - This->t.xlib.image, - 0, 0, 0, 0, - This->t.xlib.image->width, - This->t.xlib.image->height); -} - -static HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_Unlock( - LPDIRECTDRAWSURFACE4 iface,LPVOID surface) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->Unlock(%p)\n",This,surface); - - if (!This->s.ddraw->d.paintable) - return DD_OK; - - /* Only redraw the screen when unlocking the buffer that is on screen */ - if (This->t.xlib.image && (SDDSCAPS(This) & DDSCAPS_VISIBLE)) { - Xlib_copy_surface_on_screen(This); - - if (This->s.palette && This->s.palette->cm) - TSXSetWindowColormap(display,This->s.ddraw->d.drawable,This->s.palette->cm); - } - return DD_OK; -} - -static IDirectDrawSurface4Impl* _common_find_flipto( - IDirectDrawSurface4Impl* This,IDirectDrawSurface4Impl* flipto -) { - int i,j,flipable=0; - struct _surface_chain *chain = This->s.chain; - - /* if there was no override flipto, look for current backbuffer */ - if (!flipto) { - /* walk the flip chain looking for backbuffer */ - for (i=0;inrofsurfaces;i++) { - if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_FLIP) - flipable++; - if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_BACKBUFFER) - flipto = chain->surfaces[i]; - } - /* sanity checks ... */ - if (!flipto) { - if (flipable>1) { - for (i=0;inrofsurfaces;i++) - if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_FRONTBUFFER) - break; - if (i==chain->nrofsurfaces) { - /* we do not have a frontbuffer either */ - for (i=0;inrofsurfaces;i++) - if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_FLIP) { - SDDSCAPS(chain->surfaces[i])|=DDSCAPS_FRONTBUFFER; - break; - } - for (j=i+1;jnrofsurfaces+1;j++) { - int k = j % chain->nrofsurfaces; - if (SDDSCAPS(chain->surfaces[k]) & DDSCAPS_FLIP) { - SDDSCAPS(chain->surfaces[k])|=DDSCAPS_BACKBUFFER; - flipto = chain->surfaces[k]; - break; - } - } - } - } - if (!flipto) - flipto = This; - } - TRACE("flipping to %p\n",flipto); - } - return flipto; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDrawSurface4Impl_Flip( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto; - DWORD xheight; - LPBYTE surf; - - TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags); - iflipto = _common_find_flipto(This,iflipto); - - /* and flip! */ - TSXF86DGASetViewPort(display,DefaultScreen(display),0,iflipto->t.dga.fb_height); - if (iflipto->s.palette && iflipto->s.palette->cm) - TSXF86DGAInstallColormap(display,DefaultScreen(display),iflipto->s.palette->cm); - while (!TSXF86DGAViewPortChanged(display,DefaultScreen(display),2)) { - - } - /* We need to switch the lowlevel surfaces, for DGA this is: */ - - /* The height within the framebuffer */ - xheight = This->t.dga.fb_height; - This->t.dga.fb_height = iflipto->t.dga.fb_height; - iflipto->t.dga.fb_height = xheight; - - /* And the assciated surface pointer */ - surf = This->s.surface_desc.u1.lpSurface; - This->s.surface_desc.u1.lpSurface = iflipto->s.surface_desc.u1.lpSurface; - iflipto->s.surface_desc.u1.lpSurface = surf; - - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -#ifdef HAVE_LIBXXF86DGA2 -static HRESULT WINAPI DGA2_IDirectDrawSurface4Impl_Flip( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto; - DWORD xheight; - LPBYTE surf; - - TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags); - iflipto = _common_find_flipto(This,iflipto); - - /* and flip! */ - TSXDGASetViewport(display,DefaultScreen(display),0,iflipto->t.dga.fb_height, XDGAFlipRetrace); - TSXDGASync(display,DefaultScreen(display)); - TSXFlush(display); - if (iflipto->s.palette && iflipto->s.palette->cm) - TSXDGAInstallColormap(display,DefaultScreen(display),iflipto->s.palette->cm); - /* We need to switch the lowlevel surfaces, for DGA this is: */ - - /* The height within the framebuffer */ - xheight = This->t.dga.fb_height; - This->t.dga.fb_height = iflipto->t.dga.fb_height; - iflipto->t.dga.fb_height = xheight; - - /* And the assciated surface pointer */ - surf = This->s.surface_desc.u1.lpSurface; - This->s.surface_desc.u1.lpSurface = iflipto->s.surface_desc.u1.lpSurface; - iflipto->s.surface_desc.u1.lpSurface = surf; - - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA2) */ - -static HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_Flip( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - XImage *image; - LPBYTE surf; - IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto; - - TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags); - iflipto = _common_find_flipto(This,iflipto); - -#if defined(HAVE_MESAGL) && 0 /* does not work */ - if (This->s.d3d_device || (iflipto && iflipto->s.d3d_device)) { - TRACE(" - OpenGL flip\n"); - ENTER_GL(); - glXSwapBuffers(display, This->s.ddraw->d.drawable); - LEAVE_GL(); - - return DD_OK; - } -#endif /* defined(HAVE_MESAGL) */ - - if (!This->s.ddraw->d.paintable) - return DD_OK; - - /* We need to switch the lowlevel surfaces, for xlib this is: */ - /* The surface pointer */ - surf = This->s.surface_desc.u1.lpSurface; - This->s.surface_desc.u1.lpSurface = iflipto->s.surface_desc.u1.lpSurface; - iflipto->s.surface_desc.u1.lpSurface = surf; - /* the associated ximage */ - image = This->t.xlib.image; - This->t.xlib.image = iflipto->t.xlib.image; - iflipto->t.xlib.image = image; - -#ifdef HAVE_LIBXXSHM - if (This->s.ddraw->e.xlib.xshm_active) { -/* - int compl = InterlockedExchange( &This->s.ddraw->e.xlib.xshm_compl, 0 ); - if (compl) X11DRV_EVENT_WaitShmCompletion( compl ); -*/ - X11DRV_EVENT_WaitShmCompletions( This->s.ddraw->d.drawable ); - } -#endif - Xlib_copy_surface_on_screen(This); - - if (iflipto->s.palette && iflipto->s.palette->cm) - TSXSetWindowColormap(display,This->s.ddraw->d.drawable,iflipto->s.palette->cm); - return DD_OK; -} - -/* The IDirectDrawSurface4::SetPalette method attaches the specified - * DirectDrawPalette object to a surface. The surface uses this palette for all - * subsequent operations. The palette change takes place immediately. - */ -static HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_SetPalette( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal; - int i; - TRACE("(%p)->(%p)\n",This,ipal); - - if (ipal == NULL) { - if( This->s.palette != NULL ) - IDirectDrawPalette_Release((IDirectDrawPalette*)This->s.palette); - This->s.palette = ipal; - - return DD_OK; - } - - if( !(ipal->cm) && (This->s.ddraw->d.screen_pixelformat.u.dwRGBBitCount<=8)) - { - ipal->cm = TSXCreateColormap(display,This->s.ddraw->d.drawable, - X11DRV_GetVisual(),AllocAll); - - if (!Options.managed) - TSXInstallColormap(display,ipal->cm); - - for (i=0;i<256;i++) { - XColor xc; - - xc.red = ipal->palents[i].peRed<<8; - xc.blue = ipal->palents[i].peBlue<<8; - xc.green = ipal->palents[i].peGreen<<8; - xc.flags = DoRed|DoBlue|DoGreen; - xc.pixel = i; - TSXStoreColor(display,ipal->cm,&xc); - } - TSXInstallColormap(display,ipal->cm); - } - - /* According to spec, we are only supposed to - * AddRef if this is not the same palette. - */ - if( This->s.palette != ipal ) - { - if( ipal != NULL ) - IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal ); - if( This->s.palette != NULL ) - IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette ); - This->s.palette = ipal; - /* Perform the refresh */ - TSXSetWindowColormap(display,This->s.ddraw->d.drawable,This->s.palette->cm); - } - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDrawSurface4Impl_SetPalette( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal; - TRACE("(%p)->(%p)\n",This,ipal); - - /* According to spec, we are only supposed to - * AddRef if this is not the same palette. - */ - if( This->s.palette != ipal ) - { - if( ipal != NULL ) - IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal ); - if( This->s.palette != NULL ) - IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette ); - This->s.palette = ipal; -#ifdef HAVE_LIBXXF86DGA2 - if (This->s.ddraw->e.dga.version == 2) - TSXDGAInstallColormap(display,DefaultScreen(display),This->s.palette->cm); - else -#endif /* defined(HAVE_LIBXXF86DGA2) */ - TSXF86DGAInstallColormap(display,DefaultScreen(display),This->s.palette->cm); - } - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static HRESULT _Blt_ColorFill(LPBYTE buf, int width, int height, int bpp, LONG lPitch, DWORD color) -{ - int x, y; - LPBYTE first; - - /* Do first row */ - -#define COLORFILL_ROW(type) { \ - type *d = (type *) buf; \ - for (x = 0; x < width; x++) \ - d[x] = (type) color; \ - break; \ -} - - switch(bpp) { - case 1: COLORFILL_ROW(BYTE) - case 2: COLORFILL_ROW(WORD) - case 4: COLORFILL_ROW(DWORD) - default: - FIXME("Color fill not implemented for bpp %d!\n", bpp*8); - return DDERR_UNSUPPORTED; - } - -#undef COLORFILL_ROW - - /* Now copy first row */ - first = buf; - for (y = 1; y < height; y++) { - buf += lPitch; - memcpy(buf, first, width * bpp); - } - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_Blt( - LPDIRECTDRAWSURFACE4 iface,LPRECT rdst,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - RECT xdst,xsrc; - DDSURFACEDESC ddesc,sdesc; - HRESULT ret = DD_OK; - int bpp, srcheight, srcwidth, dstheight, dstwidth, width; - int x, y; - LPBYTE dbuf, sbuf; - - TRACE("(%p)->(%p,%p,%p,%08lx,%p)\n", This,rdst,src,rsrc,dwFlags,lpbltfx); - - if (src) IDirectDrawSurface4_Lock(src, NULL, &sdesc, 0, 0); - IDirectDrawSurface4_Lock(iface,NULL,&ddesc,0,0); - - if (TRACE_ON(ddraw)) { - if (rdst) TRACE("\tdestrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom); - if (rsrc) TRACE("\tsrcrect :%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); - TRACE("\tflags: "); - _dump_DDBLT(dwFlags); - if (dwFlags & DDBLT_DDFX) { - TRACE("\tblitfx: "); - _dump_DDBLTFX(lpbltfx->dwDDFX); - } - } - - if (rdst) { - if ((rdst->top < 0) || - (rdst->left < 0) || - (rdst->bottom < 0) || - (rdst->right < 0)) { - ERR(" Negative values in LPRECT !!!\n"); - goto release; - } - memcpy(&xdst,rdst,sizeof(xdst)); - } else { - xdst.top = 0; - xdst.bottom = ddesc.dwHeight; - xdst.left = 0; - xdst.right = ddesc.dwWidth; - } - - if (rsrc) { - if ((rsrc->top < 0) || - (rsrc->left < 0) || - (rsrc->bottom < 0) || - (rsrc->right < 0)) { - ERR(" Negative values in LPRECT !!!\n"); - goto release; - } - memcpy(&xsrc,rsrc,sizeof(xsrc)); - } else { - if (src) { - xsrc.top = 0; - xsrc.bottom = sdesc.dwHeight; - xsrc.left = 0; - xsrc.right = sdesc.dwWidth; - } else { - memset(&xsrc,0,sizeof(xsrc)); - } - } - - bpp = GET_BPP(ddesc); - srcheight = xsrc.bottom - xsrc.top; - srcwidth = xsrc.right - xsrc.left; - dstheight = xdst.bottom - xdst.top; - dstwidth = xdst.right - xdst.left; - width = (xdst.right - xdst.left) * bpp; - dbuf = (BYTE *) ddesc.u1.lpSurface + (xdst.top * ddesc.lPitch) + (xdst.left * bpp); - - dwFlags &= ~(DDBLT_WAIT|DDBLT_ASYNC);/* FIXME: can't handle right now */ - - /* First, all the 'source-less' blits */ - if (dwFlags & DDBLT_COLORFILL) { - ret = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, - ddesc.lPitch, lpbltfx->u4.dwFillColor); - dwFlags &= ~DDBLT_COLORFILL; - } - - if (dwFlags & DDBLT_DEPTHFILL) { -#ifdef HAVE_MESAGL - GLboolean ztest; - - /* Clears the screen */ - TRACE(" Filling depth buffer with %ld\n", lpbltfx->u4.dwFillDepth); - glClearDepth(lpbltfx->u4.dwFillDepth / 65535.0); /* We suppose a 16 bit Z Buffer */ - glGetBooleanv(GL_DEPTH_TEST, &ztest); - glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */ - glClear(GL_DEPTH_BUFFER_BIT); - glDepthMask(ztest); - - dwFlags &= ~(DDBLT_DEPTHFILL); -#endif /* defined(HAVE_MESAGL) */ - } - - if (dwFlags & DDBLT_ROP) { - /* Catch some degenerate cases here */ - switch(lpbltfx->dwROP) { - case BLACKNESS: - ret = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, ddesc.lPitch, 0); - break; - case 0xAA0029: /* No-op */ - break; - case WHITENESS: - ret = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, ddesc.lPitch, ~0); - break; - default: - FIXME("Unsupported raster op: %08lx Pattern: %p\n", lpbltfx->dwROP, lpbltfx->u4.lpDDSPattern); - goto error; - } - dwFlags &= ~DDBLT_ROP; - } - - if (dwFlags & DDBLT_DDROPS) { - FIXME("\tDdraw Raster Ops: %08lx Pattern: %p\n", lpbltfx->dwDDROP, lpbltfx->u4.lpDDSPattern); - } - - /* Now the 'with source' blits */ - if (src) { - LPBYTE sbase; - int sx, xinc, sy, yinc; - - sbase = (BYTE *) sdesc.u1.lpSurface + (xsrc.top * sdesc.lPitch) + xsrc.left * bpp; - xinc = (srcwidth << 16) / dstwidth; - yinc = (srcheight << 16) / dstheight; - - if (!dwFlags) { - - /* No effects, we can cheat here */ - if (dstwidth == srcwidth) { - if (dstheight == srcheight) { - /* No stretching in either direction. This needs to be as fast as possible */ - sbuf = sbase; - for (y = 0; y < dstheight; y++) { - memcpy(dbuf, sbuf, width); - sbuf += sdesc.lPitch; - dbuf += ddesc.lPitch; - } - } else { - /* Stretching in Y direction only */ - for (y = sy = 0; y < dstheight; y++, sy += yinc) { - sbuf = sbase + (sy >> 16) * sdesc.lPitch; - memcpy(dbuf, sbuf, width); - dbuf += ddesc.lPitch; - } - } - } else { - /* Stretching in X direction */ - int last_sy = -1; - for (y = sy = 0; y < dstheight; y++, sy += yinc) { - sbuf = sbase + (sy >> 16) * sdesc.lPitch; - - if ((sy >> 16) == (last_sy >> 16)) { - /* Same as last row - copy already stretched row */ - memcpy(dbuf, dbuf - ddesc.lPitch, width); - } else { - -#define STRETCH_ROW(type) { \ - type *s = (type *) sbuf, *d = (type *) dbuf; \ - for (x = sx = 0; x < dstwidth; x++, sx += xinc) \ - d[x] = s[sx >> 16]; \ - break; } - - switch(bpp) { - case 1: STRETCH_ROW(BYTE) - case 2: STRETCH_ROW(WORD) - case 4: STRETCH_ROW(DWORD) - case 3: { - LPBYTE s,d; - for (x = sx = 0; x < dstwidth; x++, sx+= xinc) { - DWORD pixel; - - s = sbuf+3*(sx>>16); - d = dbuf+3*x; - pixel = (s[0]<<16)|(s[1]<<8)|s[2]; - d[0] = (pixel>>16)&0xff; - d[1] = (pixel>> 8)&0xff; - d[2] = (pixel )&0xff; - } - break; - } - default: - FIXME("Stretched blit not implemented for bpp %d!\n", bpp*8); - ret = DDERR_UNSUPPORTED; - goto error; - } - -#undef STRETCH_ROW - - } - last_sy = sy; - dbuf += ddesc.lPitch; - } - } - } else if (dwFlags & (DDBLT_KEYSRC | DDBLT_KEYDEST)) { - DWORD keylow, keyhigh; - - if (dwFlags & DDBLT_KEYSRC) { - keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue; - keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue; - } else { - /* I'm not sure if this is correct */ - FIXME("DDBLT_KEYDEST not fully supported yet.\n"); - keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue; - keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue; - } - - - for (y = sy = 0; y < dstheight; y++, sy += yinc) { - sbuf = sbase + (sy >> 16) * sdesc.lPitch; - -#define COPYROW_COLORKEY(type) { \ - type *s = (type *) sbuf, *d = (type *) dbuf, tmp; \ - for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \ - tmp = s[sx >> 16]; \ - if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \ - } \ - break; } - - switch (bpp) { - case 1: COPYROW_COLORKEY(BYTE) - case 2: COPYROW_COLORKEY(WORD) - case 4: COPYROW_COLORKEY(DWORD) - default: - FIXME("%s color-keyed blit not implemented for bpp %d!\n", - (dwFlags & DDBLT_KEYSRC) ? "Source" : "Destination", bpp*8); - ret = DDERR_UNSUPPORTED; - goto error; - } - dbuf += ddesc.lPitch; - } - -#undef COPYROW_COLORKEY - - dwFlags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST); - - } - } - - error: - - if (dwFlags && FIXME_ON(ddraw)) { - FIXME("\tUnsupported flags: "); - _dump_DDBLT(dwFlags); - } - release: - - IDirectDrawSurface4_Unlock(iface,ddesc.u1.lpSurface); - if (src) IDirectDrawSurface4_Unlock(src,sdesc.u1.lpSurface); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_BltFast( - LPDIRECTDRAWSURFACE4 iface,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD trans -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - int bpp, w, h, x, y; - DDSURFACEDESC ddesc,sdesc; - HRESULT ret = DD_OK; - LPBYTE sbuf, dbuf; - RECT rsrc2; - - - if (TRACE_ON(ddraw)) { - FIXME("(%p)->(%ld,%ld,%p,%p,%08lx)\n", - This,dstx,dsty,src,rsrc,trans - ); - FIXME(" trans:"); - if (FIXME_ON(ddraw)) - _dump_DDBLTFAST(trans); - if (rsrc) - FIXME(" srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); - else - FIXME(" srcrect: NULL\n"); - } - - /* We need to lock the surfaces, or we won't get refreshes when done. */ - IDirectDrawSurface4_Lock(src, NULL,&sdesc,DDLOCK_READONLY, 0); - IDirectDrawSurface4_Lock(iface,NULL,&ddesc,DDLOCK_WRITEONLY,0); - - if (!rsrc) { - WARN("rsrc is NULL!\n"); - rsrc = &rsrc2; - rsrc->left = rsrc->top = 0; - rsrc->right = sdesc.dwWidth; - rsrc->bottom = sdesc.dwHeight; - } - - bpp = GET_BPP(This->s.surface_desc); - sbuf = (BYTE *) sdesc.u1.lpSurface + (rsrc->top * sdesc.lPitch) + rsrc->left * bpp; - dbuf = (BYTE *) ddesc.u1.lpSurface + (dsty * ddesc.lPitch) + dstx * bpp; - - - h=rsrc->bottom-rsrc->top; - if (h>ddesc.dwHeight-dsty) h=ddesc.dwHeight-dsty; - if (h>sdesc.dwHeight-rsrc->top) h=sdesc.dwHeight-rsrc->top; - if (h<0) h=0; - - w=rsrc->right-rsrc->left; - if (w>ddesc.dwWidth-dstx) w=ddesc.dwWidth-dstx; - if (w>sdesc.dwWidth-rsrc->left) w=sdesc.dwWidth-rsrc->left; - if (w<0) w=0; - - if (trans & (DDBLTFAST_SRCCOLORKEY | DDBLTFAST_DESTCOLORKEY)) { - DWORD keylow, keyhigh; - if (trans & DDBLTFAST_SRCCOLORKEY) { - keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue; - keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue; - } else { - /* I'm not sure if this is correct */ - FIXME("DDBLTFAST_DESTCOLORKEY not fully supported yet.\n"); - keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue; - keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue; - } - -#define COPYBOX_COLORKEY(type) { \ - type *d = (type *)dbuf, *s = (type *)sbuf, tmp; \ - s = (type *) ((BYTE *) sdesc.u1.lpSurface + (rsrc->top * sdesc.lPitch) + rsrc->left * bpp); \ - d = (type *) ((BYTE *) ddesc.u1.lpSurface + (dsty * ddesc.lPitch) + dstx * bpp); \ - for (y = 0; y < h; y++) { \ - for (x = 0; x < w; x++) { \ - tmp = s[x]; \ - if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \ - } \ - (LPBYTE)s += sdesc.lPitch; \ - (LPBYTE)d += ddesc.lPitch; \ - } \ - break; \ -} - - switch (bpp) { - case 1: COPYBOX_COLORKEY(BYTE) - case 2: COPYBOX_COLORKEY(WORD) - case 4: COPYBOX_COLORKEY(DWORD) - default: - FIXME("Source color key blitting not supported for bpp %d\n", bpp*8); - ret = DDERR_UNSUPPORTED; - goto error; - } - -#undef COPYBOX_COLORKEY - - } else { - int width = w * bpp; - - for (y = 0; y < h; y++) { - memcpy(dbuf, sbuf, width); - sbuf += sdesc.lPitch; - dbuf += ddesc.lPitch; - } - } - -error: - - IDirectDrawSurface4_Unlock(iface,ddesc.u1.lpSurface); - IDirectDrawSurface4_Unlock(src,sdesc.u1.lpSurface); - return ret; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_BltBatch( - LPDIRECTDRAWSURFACE4 iface,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->BltBatch(%p,%08lx,%08lx),stub!\n", - This,ddbltbatch,x,y - ); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetCaps( - LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS caps -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->GetCaps(%p)\n",This,caps); - caps->dwCaps = DDSCAPS_PALETTE; /* probably more */ - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetSurfaceDesc( - LPDIRECTDRAWSURFACE4 iface,LPDDSURFACEDESC ddsd -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->GetSurfaceDesc(%p)\n", This,ddsd); - - /* Simply copy the surface description stored in the object */ - *ddsd = This->s.surface_desc; - - if (TRACE_ON(ddraw)) { _dump_surface_desc(ddsd); } - - return DD_OK; -} - -static ULONG WINAPI IDirectDrawSurface4Impl_AddRef(LPDIRECTDRAWSURFACE4 iface) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); - return ++(This->ref); -} - -#ifdef HAVE_LIBXXF86DGA -static ULONG WINAPI DGA_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - - TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); - - if (--(This->ref)) - return This->ref; - - IDirectDraw2_Release((IDirectDraw2*)This->s.ddraw); - /* clear out of surface list */ - if (This->t.dga.fb_height == -1) - HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); - else - This->s.ddraw->e.dga.vpmask &= ~(1<<(This->t.dga.fb_height/This->s.ddraw->e.dga.fb_height)); - - /* Free the DIBSection (if any) */ - if (This->s.hdc != 0) { - SelectObject(This->s.hdc, This->s.holdbitmap); - DeleteDC(This->s.hdc); - DeleteObject(This->s.DIBsection); - } - - /* Free the clipper if attached to this surface */ - if( This->s.lpClipper ) - IDirectDrawClipper_Release(This->s.lpClipper); - - HeapFree(GetProcessHeap(),0,This); - return S_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static ULONG WINAPI Xlib_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - - TRACE( "(%p)->() decrementing from %lu.\n", This, This->ref ); - - if (--(This->ref)) - return This->ref; - - IDirectDraw2_Release((IDirectDraw2*)This->s.ddraw); - - if (This->t.xlib.image != NULL) { - if (This->s.ddraw->d.pixel_convert != NULL) { - /* In pixel conversion mode, there are 2 buffers to release. */ - HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); - -#ifdef HAVE_LIBXXSHM - if (This->s.ddraw->e.xlib.xshm_active) { - TSXShmDetach(display, &(This->t.xlib.shminfo)); - TSXDestroyImage(This->t.xlib.image); - shmdt(This->t.xlib.shminfo.shmaddr); - } else { -#endif - HeapFree(GetProcessHeap(),0,This->t.xlib.image->data); - This->t.xlib.image->data = NULL; - TSXDestroyImage(This->t.xlib.image); -#ifdef HAVE_LIBXXSHM - } -#endif - } else { - This->t.xlib.image->data = NULL; - -#ifdef HAVE_LIBXXSHM - if (This->s.ddraw->e.xlib.xshm_active) { - TSXShmDetach(display, &(This->t.xlib.shminfo)); - TSXDestroyImage(This->t.xlib.image); - shmdt(This->t.xlib.shminfo.shmaddr); - } else { -#endif - HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); - TSXDestroyImage(This->t.xlib.image); -#ifdef HAVE_LIBXXSHM - } -#endif - } - This->t.xlib.image = 0; - } else { - HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); - } - - if (This->s.palette) - IDirectDrawPalette_Release((IDirectDrawPalette*)This->s.palette); - - /* Free the DIBSection (if any) */ - if (This->s.hdc != 0) { - SelectObject(This->s.hdc, This->s.holdbitmap); - DeleteDC(This->s.hdc); - DeleteObject(This->s.DIBsection); - } - - /* Free the clipper if present */ - if( This->s.lpClipper ) - IDirectDrawClipper_Release(This->s.lpClipper); - - HeapFree(GetProcessHeap(),0,This); - return S_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetAttachedSurface( - LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE4 *lpdsf -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - int i,found = 0,xstart; - struct _surface_chain *chain; - - TRACE("(%p)->GetAttachedSurface(%p,%p)\n", This, lpddsd, lpdsf); - if (TRACE_ON(ddraw)) { - TRACE(" caps ");_dump_DDSCAPS((void *) &(lpddsd->dwCaps)); - DPRINTF("\n"); - } - chain = This->s.chain; - if (!chain) - return DDERR_NOTFOUND; - - for (i=0;inrofsurfaces;i++) - if (chain->surfaces[i] == This) - break; - - xstart = i; - for (i=0;inrofsurfaces;i++) { - if ((SDDSCAPS(chain->surfaces[(xstart+i)%chain->nrofsurfaces])&lpddsd->dwCaps) == lpddsd->dwCaps) { -#if 0 - if (found) /* may not find the same caps twice, (doc) */ - return DDERR_INVALIDPARAMS;/*FIXME: correct? */ -#endif - found = (i+1)+xstart; - } - } - if (!found) - return DDERR_NOTFOUND; - *lpdsf = (LPDIRECTDRAWSURFACE4)chain->surfaces[found-1-xstart]; - /* FIXME: AddRef? */ - TRACE("found %p\n",*lpdsf); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_Initialize( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->(%p, %p)\n",This,ddraw,lpdsfd); - - return DDERR_ALREADYINITIALIZED; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetPixelFormat( - LPDIRECTDRAWSURFACE4 iface,LPDDPIXELFORMAT pf -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->(%p)\n",This,pf); - - *pf = This->s.surface_desc.ddpfPixelFormat; - if (TRACE_ON(ddraw)) { _dump_pixelformat(pf); DPRINTF("\n"); } - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetBltStatus(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(0x%08lx),stub!\n",This,dwFlags); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetOverlayPosition( - LPDIRECTDRAWSURFACE4 iface,LPLONG x1,LPLONG x2 -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p,%p),stub!\n",This,x1,x2); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_SetClipper( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWCLIPPER lpClipper -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->(%p)!\n",This,lpClipper); - - if (This->s.lpClipper) IDirectDrawClipper_Release( This->s.lpClipper ); - This->s.lpClipper = lpClipper; - if (lpClipper) IDirectDrawClipper_AddRef( lpClipper ); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_AddAttachedSurface( - LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 surf -) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - IDirectDrawSurface4Impl*isurf = (IDirectDrawSurface4Impl*)surf; - int i; - struct _surface_chain *chain; - - FIXME("(%p)->(%p)\n",This,surf); - chain = This->s.chain; - - /* IDirectDrawSurface4_AddRef(surf); */ - - if (chain) { - for (i=0;inrofsurfaces;i++) - if (chain->surfaces[i] == isurf) - FIXME("attaching already attached surface %p to %p!\n",iface,isurf); - } else { - chain = HeapAlloc(GetProcessHeap(),0,sizeof(*chain)); - chain->nrofsurfaces = 1; - chain->surfaces = HeapAlloc(GetProcessHeap(),0,sizeof(chain->surfaces[0])); - chain->surfaces[0] = This; - This->s.chain = chain; - } - - if (chain->surfaces) - chain->surfaces = HeapReAlloc( - GetProcessHeap(), - 0, - chain->surfaces, - sizeof(chain->surfaces[0])*(chain->nrofsurfaces+1) - ); - else - chain->surfaces = HeapAlloc(GetProcessHeap(),0,sizeof(chain->surfaces[0])); - isurf->s.chain = chain; - chain->surfaces[chain->nrofsurfaces++] = isurf; - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetDC(LPDIRECTDRAWSURFACE4 iface,HDC* lphdc) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - DDSURFACEDESC desc; - BITMAPINFO *b_info; - UINT usage; - - FIXME("(%p)->GetDC(%p)\n",This,lphdc); - - /* Creates a DIB Section of the same size / format as the surface */ - IDirectDrawSurface4_Lock(iface,NULL,&desc,0,0); - - if (This->s.hdc == 0) { - switch (desc.ddpfPixelFormat.u.dwRGBBitCount) { - case 16: - case 32: -#if 0 /* This should be filled if Wine's DIBSection did understand BI_BITFIELDS */ - b_info = (BITMAPINFO *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + 3 * sizeof(DWORD)); - break; -#endif - - case 24: - b_info = (BITMAPINFO *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER)); - break; - - default: - b_info = (BITMAPINFO *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (2 << desc.ddpfPixelFormat.u.dwRGBBitCount)); - break; - } - - b_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - b_info->bmiHeader.biWidth = desc.dwWidth; - b_info->bmiHeader.biHeight = desc.dwHeight; - b_info->bmiHeader.biPlanes = 1; - b_info->bmiHeader.biBitCount = desc.ddpfPixelFormat.u.dwRGBBitCount; -#if 0 - if ((desc.ddpfPixelFormat.u.dwRGBBitCount != 16) && - (desc.ddpfPixelFormat.u.dwRGBBitCount != 32)) -#endif - b_info->bmiHeader.biCompression = BI_RGB; -#if 0 - else - b_info->bmiHeader.biCompression = BI_BITFIELDS; -#endif - b_info->bmiHeader.biSizeImage = (desc.ddpfPixelFormat.u.dwRGBBitCount / 8) * desc.dwWidth * desc.dwHeight; - b_info->bmiHeader.biXPelsPerMeter = 0; - b_info->bmiHeader.biYPelsPerMeter = 0; - b_info->bmiHeader.biClrUsed = 0; - b_info->bmiHeader.biClrImportant = 0; - - switch (desc.ddpfPixelFormat.u.dwRGBBitCount) { - case 16: - case 32: -#if 0 - { - DWORD *masks = (DWORD *) &(b_info->bmiColors); - - usage = 0; - masks[0] = desc.ddpfPixelFormat.u1.dwRBitMask; - masks[1] = desc.ddpfPixelFormat.u2.dwGBitMask; - masks[2] = desc.ddpfPixelFormat.u3.dwBBitMask; - } - break; -#endif - case 24: - /* Nothing to do */ - usage = DIB_RGB_COLORS; - break; - - default: { - int i; - - /* Fill the palette */ - usage = DIB_RGB_COLORS; - - if (This->s.palette == NULL) { - ERR("Bad palette !!!\n"); - } else { - RGBQUAD *rgb = (RGBQUAD *) &(b_info->bmiColors); - PALETTEENTRY *pent = (PALETTEENTRY *)&(This->s.palette->palents); - - for (i=0;i<(1<s.DIBsection = CreateDIBSection(BeginPaint(This->s.ddraw->d.mainWindow,&This->s.ddraw->d.ps), - b_info, - usage, - &(This->s.bitmap_data), - 0, - 0 - ); - EndPaint(This->s.ddraw->d.mainWindow,&This->s.ddraw->d.ps); - TRACE("DIBSection at : %p\n", This->s.bitmap_data); - - /* b_info is not useful anymore */ - HeapFree(GetProcessHeap(), 0, b_info); - - /* Create the DC */ - This->s.hdc = CreateCompatibleDC(0); - This->s.holdbitmap = SelectObject(This->s.hdc, This->s.DIBsection); - } - - /* Copy our surface in the DIB section */ - if ((GET_BPP(desc) * desc.dwWidth) == desc.lPitch) - memcpy(This->s.bitmap_data,desc.u1.lpSurface,desc.lPitch*desc.dwHeight); - else - /* TODO */ - FIXME("This case has to be done :/\n"); - - TRACE("HDC : %08lx\n", (DWORD) This->s.hdc); - *lphdc = This->s.hdc; - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_ReleaseDC(LPDIRECTDRAWSURFACE4 iface,HDC hdc) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - - FIXME("(%p)->(0x%08lx),stub!\n",This,(long)hdc); - TRACE( "Copying DIBSection at : %p\n", This->s.bitmap_data); - /* Copy the DIB section to our surface */ - if ((GET_BPP(This->s.surface_desc) * This->s.surface_desc.dwWidth) == This->s.surface_desc.lPitch) { - memcpy(This->s.surface_desc.u1.lpSurface, This->s.bitmap_data, This->s.surface_desc.lPitch * This->s.surface_desc.dwHeight); - } else { - /* TODO */ - FIXME("This case has to be done :/\n"); - } - /* Unlock the surface */ - IDirectDrawSurface4_Unlock(iface,This->s.surface_desc.u1.lpSurface); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_QueryInterface(LPDIRECTDRAWSURFACE4 iface,REFIID refiid,LPVOID *obj) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); - - /* All DirectDrawSurface versions (1, 2, 3 and 4) use - * the same interface. And IUnknown does that too of course. - */ - if ( IsEqualGUID( &IID_IDirectDrawSurface4, refiid ) || - IsEqualGUID( &IID_IDirectDrawSurface3, refiid ) || - IsEqualGUID( &IID_IDirectDrawSurface2, refiid ) || - IsEqualGUID( &IID_IDirectDrawSurface, refiid ) || - IsEqualGUID( &IID_IUnknown, refiid ) - ) { - *obj = This; - IDirectDrawSurface4_AddRef(iface); - - TRACE(" Creating IDirectDrawSurface interface (%p)\n", *obj); - return S_OK; - } - else if ( IsEqualGUID( &IID_IDirect3DTexture2, refiid ) ) - { - /* Texture interface */ - *obj = d3dtexture2_create(This); - IDirectDrawSurface4_AddRef(iface); - TRACE(" Creating IDirect3DTexture2 interface (%p)\n", *obj); - return S_OK; - } - else if ( IsEqualGUID( &IID_IDirect3DTexture, refiid ) ) - { - /* Texture interface */ - *obj = d3dtexture_create(This); - IDirectDrawSurface4_AddRef(iface); - - TRACE(" Creating IDirect3DTexture interface (%p)\n", *obj); - - return S_OK; - } - else if (is_OpenGL_dx3(refiid, (IDirectDrawSurfaceImpl*)This, (IDirect3DDeviceImpl**) obj)) { - /* It is the OpenGL Direct3D Device */ - IDirectDrawSurface4_AddRef(iface); - TRACE(" Creating IDirect3DDevice interface (%p)\n", *obj); - return S_OK; - } - - FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); - return OLE_E_ENUM_NOMORE; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_IsLost(LPDIRECTDRAWSURFACE4 iface) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->(), stub!\n",This); - return DD_OK; /* hmm */ -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE4 iface,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - int i; - struct _surface_chain *chain = This->s.chain; - - TRACE("(%p)->(%p,%p)\n",This,context,esfcb); - for (i=0;inrofsurfaces;i++) { - TRACE( "Enumerating attached surface (%p)\n", chain->surfaces[i]); - if (esfcb((LPDIRECTDRAWSURFACE) chain->surfaces[i], &(chain->surfaces[i]->s.surface_desc), context) == DDENUMRET_CANCEL) - return DD_OK; /* FIXME: return value correct? */ - } - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_Restore(LPDIRECTDRAWSURFACE4 iface) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(),stub!\n",This); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_SetColorKey( - LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags, LPDDCOLORKEY ckey ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->(0x%08lx,%p)\n",This,dwFlags,ckey); - if (TRACE_ON(ddraw)) { - _dump_colorkeyflag(dwFlags); - DPRINTF(" : "); - _dump_DDCOLORKEY((void *) ckey); - DPRINTF("\n"); - } - - /* If this surface was loaded as a texture, call also the texture - SetColorKey callback */ - if (This->s.texture) { - This->s.SetColorKey_cb(This->s.texture, dwFlags, ckey); - } - - if( dwFlags & DDCKEY_SRCBLT ) - { - dwFlags &= ~DDCKEY_SRCBLT; - This->s.surface_desc.dwFlags |= DDSD_CKSRCBLT; - memcpy( &(This->s.surface_desc.ddckCKSrcBlt), ckey, sizeof( *ckey ) ); - } - - if( dwFlags & DDCKEY_DESTBLT ) - { - dwFlags &= ~DDCKEY_DESTBLT; - This->s.surface_desc.dwFlags |= DDSD_CKDESTBLT; - memcpy( &(This->s.surface_desc.ddckCKDestBlt), ckey, sizeof( *ckey ) ); - } - - if( dwFlags & DDCKEY_SRCOVERLAY ) - { - dwFlags &= ~DDCKEY_SRCOVERLAY; - This->s.surface_desc.dwFlags |= DDSD_CKSRCOVERLAY; - memcpy( &(This->s.surface_desc.ddckCKSrcOverlay), ckey, sizeof( *ckey ) ); - } - - if( dwFlags & DDCKEY_DESTOVERLAY ) - { - dwFlags &= ~DDCKEY_DESTOVERLAY; - This->s.surface_desc.dwFlags |= DDSD_CKDESTOVERLAY; - memcpy( &(This->s.surface_desc.ddckCKDestOverlay), ckey, sizeof( *ckey ) ); - } - - if( dwFlags ) - { - FIXME("unhandled dwFlags: 0x%08lx\n", dwFlags ); - } - - return DD_OK; - -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_AddOverlayDirtyRect( - LPDIRECTDRAWSURFACE4 iface, - LPRECT lpRect ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p),stub!\n",This,lpRect); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_DeleteAttachedSurface( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags, - LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - int i; - struct _surface_chain *chain; - - TRACE("(%p)->(0x%08lx,%p)\n",This,dwFlags,lpDDSAttachedSurface); - chain = This->s.chain; - for (i=0;inrofsurfaces;i++) { - if ((IDirectDrawSurface4Impl*)lpDDSAttachedSurface==chain->surfaces[i]){ - IDirectDrawSurface4_Release(lpDDSAttachedSurface); - - chain->surfaces[i]->s.chain = NULL; - memcpy( chain->surfaces+i, - chain->surfaces+(i+1), - (chain->nrofsurfaces-i-1)*sizeof(chain->surfaces[i]) - ); - chain->surfaces = HeapReAlloc( - GetProcessHeap(), - 0, - chain->surfaces, - sizeof(chain->surfaces[i])*(chain->nrofsurfaces-1) - ); - chain->nrofsurfaces--; - return DD_OK; - } - } - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_EnumOverlayZOrders( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags, - LPVOID lpContext, - LPDDENUMSURFACESCALLBACK lpfnCallback ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(0x%08lx,%p,%p),stub!\n", This,dwFlags, - lpContext, lpfnCallback ); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetClipper( - LPDIRECTDRAWSURFACE4 iface, - LPDIRECTDRAWCLIPPER* lplpDDClipper ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p),stub!\n", This, lplpDDClipper); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetColorKey( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags, - LPDDCOLORKEY lpDDColorKey ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->(0x%08lx,%p)\n", This, dwFlags, lpDDColorKey); - - if( dwFlags & DDCKEY_SRCBLT ) { - dwFlags &= ~DDCKEY_SRCBLT; - memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKSrcBlt), sizeof( *lpDDColorKey ) ); - } - - if( dwFlags & DDCKEY_DESTBLT ) - { - dwFlags &= ~DDCKEY_DESTBLT; - memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKDestBlt), sizeof( *lpDDColorKey ) ); - } - - if( dwFlags & DDCKEY_SRCOVERLAY ) - { - dwFlags &= ~DDCKEY_SRCOVERLAY; - memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKSrcOverlay), sizeof( *lpDDColorKey ) ); - } - - if( dwFlags & DDCKEY_DESTOVERLAY ) - { - dwFlags &= ~DDCKEY_DESTOVERLAY; - memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKDestOverlay), sizeof( *lpDDColorKey ) ); - } - - if( dwFlags ) - { - FIXME("unhandled dwFlags: 0x%08lx\n", dwFlags ); - } - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetFlipStatus( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetPalette( - LPDIRECTDRAWSURFACE4 iface, - LPDIRECTDRAWPALETTE* lplpDDPalette ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - TRACE("(%p)->(%p),stub!\n", This, lplpDDPalette); - - if (This->s.palette != NULL) { - IDirectDrawPalette_AddRef( (IDirectDrawPalette*) This->s.palette ); - - *lplpDDPalette = (IDirectDrawPalette*) This->s.palette; - return DD_OK; - } else { - return DDERR_NOPALETTEATTACHED; - } -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_SetOverlayPosition( - LPDIRECTDRAWSURFACE4 iface, - LONG lX, - LONG lY) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%ld,%ld),stub!\n", This, lX, lY); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlay( - LPDIRECTDRAWSURFACE4 iface, - LPRECT lpSrcRect, - LPDIRECTDRAWSURFACE4 lpDDDestSurface, - LPRECT lpDestRect, - DWORD dwFlags, - LPDDOVERLAYFX lpDDOverlayFx ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p,%p,%p,0x%08lx,%p),stub!\n", This, - lpSrcRect, lpDDDestSurface, lpDestRect, dwFlags, lpDDOverlayFx ); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayDisplay( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayZOrder( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags, - LPDIRECTDRAWSURFACE4 lpDDSReference ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(0x%08lx,%p),stub!\n", This, dwFlags, lpDDSReference); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetDDInterface( - LPDIRECTDRAWSURFACE4 iface, - LPVOID* lplpDD ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p),stub!\n", This, lplpDD); - - /* Not sure about that... */ - *lplpDD = (void *) This->s.ddraw; - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_PageLock( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_PageUnlock( - LPDIRECTDRAWSURFACE4 iface, - DWORD dwFlags ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_SetSurfaceDesc( - LPDIRECTDRAWSURFACE4 iface, - LPDDSURFACEDESC lpDDSD, - DWORD dwFlags ) -{ - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p,0x%08lx),stub!\n", This, lpDDSD, dwFlags); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_SetPrivateData(LPDIRECTDRAWSURFACE4 iface, - REFGUID guidTag, - LPVOID lpData, - DWORD cbSize, - DWORD dwFlags) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p,%p,%ld,%08lx\n", This, guidTag, lpData, cbSize, dwFlags); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetPrivateData(LPDIRECTDRAWSURFACE4 iface, - REFGUID guidTag, - LPVOID lpBuffer, - LPDWORD lpcbBufferSize) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p,%p,%p)\n", This, guidTag, lpBuffer, lpcbBufferSize); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_FreePrivateData(LPDIRECTDRAWSURFACE4 iface, - REFGUID guidTag) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p)\n", This, guidTag); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_GetUniquenessValue(LPDIRECTDRAWSURFACE4 iface, - LPDWORD lpValue) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)->(%p)\n", This, lpValue); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawSurface4Impl_ChangeUniquenessValue(LPDIRECTDRAWSURFACE4 iface) { - ICOM_THIS(IDirectDrawSurface4Impl,iface); - FIXME("(%p)\n", This); - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static ICOM_VTABLE(IDirectDrawSurface4) dga_dds4vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirectDrawSurface4Impl_QueryInterface, - IDirectDrawSurface4Impl_AddRef, - DGA_IDirectDrawSurface4Impl_Release, - IDirectDrawSurface4Impl_AddAttachedSurface, - IDirectDrawSurface4Impl_AddOverlayDirtyRect, - IDirectDrawSurface4Impl_Blt, - IDirectDrawSurface4Impl_BltBatch, - IDirectDrawSurface4Impl_BltFast, - IDirectDrawSurface4Impl_DeleteAttachedSurface, - IDirectDrawSurface4Impl_EnumAttachedSurfaces, - IDirectDrawSurface4Impl_EnumOverlayZOrders, - DGA_IDirectDrawSurface4Impl_Flip, - IDirectDrawSurface4Impl_GetAttachedSurface, - IDirectDrawSurface4Impl_GetBltStatus, - IDirectDrawSurface4Impl_GetCaps, - IDirectDrawSurface4Impl_GetClipper, - IDirectDrawSurface4Impl_GetColorKey, - IDirectDrawSurface4Impl_GetDC, - IDirectDrawSurface4Impl_GetFlipStatus, - IDirectDrawSurface4Impl_GetOverlayPosition, - IDirectDrawSurface4Impl_GetPalette, - IDirectDrawSurface4Impl_GetPixelFormat, - IDirectDrawSurface4Impl_GetSurfaceDesc, - IDirectDrawSurface4Impl_Initialize, - IDirectDrawSurface4Impl_IsLost, - IDirectDrawSurface4Impl_Lock, - IDirectDrawSurface4Impl_ReleaseDC, - IDirectDrawSurface4Impl_Restore, - IDirectDrawSurface4Impl_SetClipper, - IDirectDrawSurface4Impl_SetColorKey, - IDirectDrawSurface4Impl_SetOverlayPosition, - DGA_IDirectDrawSurface4Impl_SetPalette, - DGA_IDirectDrawSurface4Impl_Unlock, - IDirectDrawSurface4Impl_UpdateOverlay, - IDirectDrawSurface4Impl_UpdateOverlayDisplay, - IDirectDrawSurface4Impl_UpdateOverlayZOrder, - IDirectDrawSurface4Impl_GetDDInterface, - IDirectDrawSurface4Impl_PageLock, - IDirectDrawSurface4Impl_PageUnlock, - IDirectDrawSurface4Impl_SetSurfaceDesc, - IDirectDrawSurface4Impl_SetPrivateData, - IDirectDrawSurface4Impl_GetPrivateData, - IDirectDrawSurface4Impl_FreePrivateData, - IDirectDrawSurface4Impl_GetUniquenessValue, - IDirectDrawSurface4Impl_ChangeUniquenessValue -}; -#endif /* defined(HAVE_LIBXXF86DGA) */ - -#ifdef HAVE_LIBXXF86DGA2 -static ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirectDrawSurface4Impl_QueryInterface, - IDirectDrawSurface4Impl_AddRef, - DGA_IDirectDrawSurface4Impl_Release, - IDirectDrawSurface4Impl_AddAttachedSurface, - IDirectDrawSurface4Impl_AddOverlayDirtyRect, - IDirectDrawSurface4Impl_Blt, - IDirectDrawSurface4Impl_BltBatch, - IDirectDrawSurface4Impl_BltFast, - IDirectDrawSurface4Impl_DeleteAttachedSurface, - IDirectDrawSurface4Impl_EnumAttachedSurfaces, - IDirectDrawSurface4Impl_EnumOverlayZOrders, - DGA2_IDirectDrawSurface4Impl_Flip, - IDirectDrawSurface4Impl_GetAttachedSurface, - IDirectDrawSurface4Impl_GetBltStatus, - IDirectDrawSurface4Impl_GetCaps, - IDirectDrawSurface4Impl_GetClipper, - IDirectDrawSurface4Impl_GetColorKey, - IDirectDrawSurface4Impl_GetDC, - IDirectDrawSurface4Impl_GetFlipStatus, - IDirectDrawSurface4Impl_GetOverlayPosition, - IDirectDrawSurface4Impl_GetPalette, - IDirectDrawSurface4Impl_GetPixelFormat, - IDirectDrawSurface4Impl_GetSurfaceDesc, - IDirectDrawSurface4Impl_Initialize, - IDirectDrawSurface4Impl_IsLost, - IDirectDrawSurface4Impl_Lock, - IDirectDrawSurface4Impl_ReleaseDC, - IDirectDrawSurface4Impl_Restore, - IDirectDrawSurface4Impl_SetClipper, - IDirectDrawSurface4Impl_SetColorKey, - IDirectDrawSurface4Impl_SetOverlayPosition, - DGA_IDirectDrawSurface4Impl_SetPalette, - DGA_IDirectDrawSurface4Impl_Unlock, - IDirectDrawSurface4Impl_UpdateOverlay, - IDirectDrawSurface4Impl_UpdateOverlayDisplay, - IDirectDrawSurface4Impl_UpdateOverlayZOrder, - IDirectDrawSurface4Impl_GetDDInterface, - IDirectDrawSurface4Impl_PageLock, - IDirectDrawSurface4Impl_PageUnlock, - IDirectDrawSurface4Impl_SetSurfaceDesc, - IDirectDrawSurface4Impl_SetPrivateData, - IDirectDrawSurface4Impl_GetPrivateData, - IDirectDrawSurface4Impl_FreePrivateData, - IDirectDrawSurface4Impl_GetUniquenessValue, - IDirectDrawSurface4Impl_ChangeUniquenessValue -}; -#endif /* defined(HAVE_LIBXXF86DGA2) */ - -static ICOM_VTABLE(IDirectDrawSurface4) xlib_dds4vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirectDrawSurface4Impl_QueryInterface, - IDirectDrawSurface4Impl_AddRef, - Xlib_IDirectDrawSurface4Impl_Release, - IDirectDrawSurface4Impl_AddAttachedSurface, - IDirectDrawSurface4Impl_AddOverlayDirtyRect, - IDirectDrawSurface4Impl_Blt, - IDirectDrawSurface4Impl_BltBatch, - IDirectDrawSurface4Impl_BltFast, - IDirectDrawSurface4Impl_DeleteAttachedSurface, - IDirectDrawSurface4Impl_EnumAttachedSurfaces, - IDirectDrawSurface4Impl_EnumOverlayZOrders, - Xlib_IDirectDrawSurface4Impl_Flip, - IDirectDrawSurface4Impl_GetAttachedSurface, - IDirectDrawSurface4Impl_GetBltStatus, - IDirectDrawSurface4Impl_GetCaps, - IDirectDrawSurface4Impl_GetClipper, - IDirectDrawSurface4Impl_GetColorKey, - IDirectDrawSurface4Impl_GetDC, - IDirectDrawSurface4Impl_GetFlipStatus, - IDirectDrawSurface4Impl_GetOverlayPosition, - IDirectDrawSurface4Impl_GetPalette, - IDirectDrawSurface4Impl_GetPixelFormat, - IDirectDrawSurface4Impl_GetSurfaceDesc, - IDirectDrawSurface4Impl_Initialize, - IDirectDrawSurface4Impl_IsLost, - IDirectDrawSurface4Impl_Lock, - IDirectDrawSurface4Impl_ReleaseDC, - IDirectDrawSurface4Impl_Restore, - IDirectDrawSurface4Impl_SetClipper, - IDirectDrawSurface4Impl_SetColorKey, - IDirectDrawSurface4Impl_SetOverlayPosition, - Xlib_IDirectDrawSurface4Impl_SetPalette, - Xlib_IDirectDrawSurface4Impl_Unlock, - IDirectDrawSurface4Impl_UpdateOverlay, - IDirectDrawSurface4Impl_UpdateOverlayDisplay, - IDirectDrawSurface4Impl_UpdateOverlayZOrder, - IDirectDrawSurface4Impl_GetDDInterface, - IDirectDrawSurface4Impl_PageLock, - IDirectDrawSurface4Impl_PageUnlock, - IDirectDrawSurface4Impl_SetSurfaceDesc, - IDirectDrawSurface4Impl_SetPrivateData, - IDirectDrawSurface4Impl_GetPrivateData, - IDirectDrawSurface4Impl_FreePrivateData, - IDirectDrawSurface4Impl_GetUniquenessValue, - IDirectDrawSurface4Impl_ChangeUniquenessValue -}; - -/****************************************************************************** - * DirectDrawCreateClipper (DDRAW.7) - */ -HRESULT WINAPI DirectDrawCreateClipper( DWORD dwFlags, - LPDIRECTDRAWCLIPPER *lplpDDClipper, - LPUNKNOWN pUnkOuter) -{ - IDirectDrawClipperImpl** ilplpDDClipper=(IDirectDrawClipperImpl**)lplpDDClipper; - TRACE("(%08lx,%p,%p)\n", dwFlags, ilplpDDClipper, pUnkOuter); - - *ilplpDDClipper = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipperImpl)); - ICOM_VTBL(*ilplpDDClipper) = &ddclipvt; - (*ilplpDDClipper)->ref = 1; - - (*ilplpDDClipper)->hWnd = 0; - - return DD_OK; -} - -/****************************************************************************** - * IDirectDrawClipper - */ -static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd( - LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd -) { - ICOM_THIS(IDirectDrawClipperImpl,iface); - - TRACE("(%p)->SetHwnd(0x%08lx,0x%08lx)\n",This,dwFlags,(DWORD)hWnd); - if( dwFlags ) { - FIXME("dwFlags = 0x%08lx, not supported.\n",dwFlags); - return DDERR_INVALIDPARAMS; - } - - This->hWnd = hWnd; - return DD_OK; -} - -static ULONG WINAPI IDirectDrawClipperImpl_Release(LPDIRECTDRAWCLIPPER iface) { - ICOM_THIS(IDirectDrawClipperImpl,iface); - TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); - - This->ref--; - if (This->ref) - return This->ref; - HeapFree(GetProcessHeap(),0,This); - return S_OK; -} - -static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList( - LPDIRECTDRAWCLIPPER iface,LPRECT rects,LPRGNDATA lprgn,LPDWORD hmm -) { - ICOM_THIS(IDirectDrawClipperImpl,iface); - FIXME("(%p,%p,%p,%p),stub!\n",This,rects,lprgn,hmm); - if (hmm) *hmm=0; - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList( - LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD hmm -) { - ICOM_THIS(IDirectDrawClipperImpl,iface); - FIXME("(%p,%p,%ld),stub!\n",This,lprgn,hmm); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface( - LPDIRECTDRAWCLIPPER iface, - REFIID riid, - LPVOID* ppvObj ) -{ - ICOM_THIS(IDirectDrawClipperImpl,iface); - FIXME("(%p)->(%p,%p),stub!\n",This,riid,ppvObj); - return OLE_E_ENUM_NOMORE; -} - -static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface ) -{ - ICOM_THIS(IDirectDrawClipperImpl,iface); - TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); - return ++(This->ref); -} - -static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd( - LPDIRECTDRAWCLIPPER iface, - HWND* hWndPtr ) -{ - ICOM_THIS(IDirectDrawClipperImpl,iface); - FIXME("(%p)->(%p),stub!\n",This,hWndPtr); - - *hWndPtr = This->hWnd; - - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawClipperImpl_Initialize( - LPDIRECTDRAWCLIPPER iface, - LPDIRECTDRAW lpDD, - DWORD dwFlags ) -{ - ICOM_THIS(IDirectDrawClipperImpl,iface); - FIXME("(%p)->(%p,0x%08lx),stub!\n",This,lpDD,dwFlags); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged( - LPDIRECTDRAWCLIPPER iface, - BOOL* lpbChanged ) -{ - ICOM_THIS(IDirectDrawClipperImpl,iface); - FIXME("(%p)->(%p),stub!\n",This,lpbChanged); - return DD_OK; -} - -static ICOM_VTABLE(IDirectDrawClipper) ddclipvt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirectDrawClipperImpl_QueryInterface, - IDirectDrawClipperImpl_AddRef, - IDirectDrawClipperImpl_Release, - IDirectDrawClipperImpl_GetClipList, - IDirectDrawClipperImpl_GetHWnd, - IDirectDrawClipperImpl_Initialize, - IDirectDrawClipperImpl_IsClipListChanged, - IDirectDrawClipperImpl_SetClipList, - IDirectDrawClipperImpl_SetHwnd -}; - - -/****************************************************************************** - * IDirectDrawPalette - */ -static HRESULT WINAPI IDirectDrawPaletteImpl_GetEntries( - LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent -) { - ICOM_THIS(IDirectDrawPaletteImpl,iface); - int i; - - TRACE("(%p)->GetEntries(%08lx,%ld,%ld,%p)\n", - This,x,start,count,palent); - - /* No palette created and not in depth-convertion mode -> BUG ! */ - if ((This->cm == None) && - (This->ddraw->d.palette_convert == NULL)) - { - FIXME("app tried to read colormap for non-palettized mode\n"); - return DDERR_GENERIC; - } - for (i=0;ipalents[start+i].peRed; - palent[i].peBlue = This->palents[start+i].peBlue; - palent[i].peGreen = This->palents[start+i].peGreen; - palent[i].peFlags = This->palents[start+i].peFlags; - - } - return DD_OK; -} - -static HRESULT WINAPI Xlib_IDirectDrawPaletteImpl_SetEntries( - LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent -) { - ICOM_THIS(IDirectDrawPaletteImpl,iface); - XColor xc; - int i; - - TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n", - This,x,start,count,palent - ); - for (i=0;icm) - TSXStoreColor(display,This->cm,&xc); - - This->palents[start+i].peRed = palent[i].peRed; - This->palents[start+i].peBlue = palent[i].peBlue; - This->palents[start+i].peGreen = palent[i].peGreen; - This->palents[start+i].peFlags = palent[i].peFlags; - } - - /* Now, if we are in 'depth conversion mode', update the screen palette */ - /* FIXME: we need to update the image or we won't get palette fading. */ - if (This->ddraw->d.palette_convert != NULL) - This->ddraw->d.palette_convert(palent, This->screen_palents, start, count); - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDrawPaletteImpl_SetEntries( - LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent -) { - ICOM_THIS(IDirectDrawPaletteImpl,iface); - XColor xc; - Colormap cm; - int i; - - TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n", - This,x,start,count,palent - ); - if (!This->cm) /* should not happen */ { - FIXME("app tried to set colormap in non-palettized mode\n"); - return DDERR_GENERIC; - } - /* FIXME: free colorcells instead of freeing whole map */ - cm = This->cm; - This->cm = TSXCopyColormapAndFree(display,This->cm); - TSXFreeColormap(display,cm); - - for (i=0;icm,&xc); - - This->palents[start+i].peRed = palent[i].peRed; - This->palents[start+i].peBlue = palent[i].peBlue; - This->palents[start+i].peGreen = palent[i].peGreen; - This->palents[start+i].peFlags = palent[i].peFlags; - } -#ifdef HAVE_LIBXXF86DGA2 - if (This->ddraw->e.dga.version == 2) - TSXDGAInstallColormap(display,DefaultScreen(display),This->cm); - else -#endif /* defined(HAVE_LIBXXF86DGA2) */ - TSXF86DGAInstallColormap(display,DefaultScreen(display),This->cm); - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static ULONG WINAPI IDirectDrawPaletteImpl_Release(LPDIRECTDRAWPALETTE iface) { - ICOM_THIS(IDirectDrawPaletteImpl,iface); - TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); - if (!--(This->ref)) { - if (This->cm) { - TSXFreeColormap(display,This->cm); - This->cm = 0; - } - HeapFree(GetProcessHeap(),0,This); - return S_OK; - } - return This->ref; -} - -static ULONG WINAPI IDirectDrawPaletteImpl_AddRef(LPDIRECTDRAWPALETTE iface) { - ICOM_THIS(IDirectDrawPaletteImpl,iface); - - TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); - return ++(This->ref); -} - -static HRESULT WINAPI IDirectDrawPaletteImpl_Initialize( - LPDIRECTDRAWPALETTE iface,LPDIRECTDRAW ddraw,DWORD x,LPPALETTEENTRY palent -) { - ICOM_THIS(IDirectDrawPaletteImpl,iface); - TRACE("(%p)->(%p,%ld,%p)\n", This, ddraw, x, palent); - - return DDERR_ALREADYINITIALIZED; -} - -static HRESULT WINAPI IDirectDrawPaletteImpl_GetCaps( - LPDIRECTDRAWPALETTE iface, LPDWORD lpdwCaps ) -{ - ICOM_THIS(IDirectDrawPaletteImpl,iface); - FIXME("(%p)->(%p) stub.\n", This, lpdwCaps ); - return DD_OK; -} - -static HRESULT WINAPI IDirectDrawPaletteImpl_QueryInterface( - LPDIRECTDRAWPALETTE iface,REFIID refiid,LPVOID *obj ) -{ - ICOM_THIS(IDirectDrawPaletteImpl,iface); - - FIXME("(%p)->(%s,%p) stub.\n",This,debugstr_guid(refiid),obj); - - return S_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static ICOM_VTABLE(IDirectDrawPalette) dga_ddpalvt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirectDrawPaletteImpl_QueryInterface, - IDirectDrawPaletteImpl_AddRef, - IDirectDrawPaletteImpl_Release, - IDirectDrawPaletteImpl_GetCaps, - IDirectDrawPaletteImpl_GetEntries, - IDirectDrawPaletteImpl_Initialize, - DGA_IDirectDrawPaletteImpl_SetEntries -}; -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static ICOM_VTABLE(IDirectDrawPalette) xlib_ddpalvt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirectDrawPaletteImpl_QueryInterface, - IDirectDrawPaletteImpl_AddRef, - IDirectDrawPaletteImpl_Release, - IDirectDrawPaletteImpl_GetCaps, - IDirectDrawPaletteImpl_GetEntries, - IDirectDrawPaletteImpl_Initialize, - Xlib_IDirectDrawPaletteImpl_SetEntries -}; - -/******************************************************************************* - * IDirect3D - */ -static HRESULT WINAPI IDirect3DImpl_QueryInterface( - LPDIRECT3D iface,REFIID refiid,LPVOID *obj -) { - ICOM_THIS(IDirect3DImpl,iface); - /* FIXME: Not sure if this is correct */ - - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); - if ( ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) || - ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) || - ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) { - *obj = This->ddraw; - IDirect3D_AddRef(iface); - - TRACE(" Creating IDirectDrawX interface (%p)\n", *obj); - - return S_OK; - } - if ( ( IsEqualGUID( &IID_IDirect3D, refiid ) ) || - ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) { - *obj = This; - IDirect3D_AddRef(iface); - - TRACE(" Creating IDirect3D interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) { - IDirect3D2Impl* d3d; - - d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); - d3d->ref = 1; - d3d->ddraw = This->ddraw; - IDirect3D_AddRef(iface); - ICOM_VTBL(d3d) = &d3d2vt; - *obj = d3d; - - TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); - - return S_OK; - } - FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); - return OLE_E_ENUM_NOMORE; -} - -static ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface) { - ICOM_THIS(IDirect3DImpl,iface); - TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); - - return ++(This->ref); -} - -static ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface) -{ - ICOM_THIS(IDirect3DImpl,iface); - TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); - - if (!--(This->ref)) { - IDirectDraw2_Release((IDirectDraw2*)This->ddraw); - HeapFree(GetProcessHeap(),0,This); - return S_OK; - } - return This->ref; -} - -static HRESULT WINAPI IDirect3DImpl_Initialize( - LPDIRECT3D iface, REFIID refiid ) -{ - ICOM_THIS(IDirect3DImpl,iface); - /* FIXME: Not sure if this is correct */ - - FIXME("(%p)->(%s):stub.\n",This,debugstr_guid(refiid)); - - return DDERR_ALREADYINITIALIZED; -} - -static HRESULT WINAPI IDirect3DImpl_EnumDevices(LPDIRECT3D iface, - LPD3DENUMDEVICESCALLBACK cb, - LPVOID context) { - ICOM_THIS(IDirect3DImpl,iface); - FIXME("(%p)->(%p,%p),stub!\n",This,cb,context); - - /* Call functions defined in d3ddevices.c */ - if (!d3d_OpenGL_dx3(cb, context)) - return DD_OK; - - return DD_OK; -} - -static HRESULT WINAPI IDirect3DImpl_CreateLight(LPDIRECT3D iface, - LPDIRECT3DLIGHT *lplight, - IUnknown *lpunk) -{ - ICOM_THIS(IDirect3DImpl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk); - - /* Call the creation function that is located in d3dlight.c */ - *lplight = d3dlight_create_dx3(This); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3DImpl_CreateMaterial(LPDIRECT3D iface, - LPDIRECT3DMATERIAL *lpmaterial, - IUnknown *lpunk) -{ - ICOM_THIS(IDirect3DImpl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk); - - /* Call the creation function that is located in d3dviewport.c */ - *lpmaterial = d3dmaterial_create(This); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3DImpl_CreateViewport(LPDIRECT3D iface, - LPDIRECT3DVIEWPORT *lpviewport, - IUnknown *lpunk) -{ - ICOM_THIS(IDirect3DImpl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk); - - /* Call the creation function that is located in d3dviewport.c */ - *lpviewport = d3dviewport_create(This); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3DImpl_FindDevice(LPDIRECT3D iface, - LPD3DFINDDEVICESEARCH lpfinddevsrc, - LPD3DFINDDEVICERESULT lpfinddevrst) -{ - ICOM_THIS(IDirect3DImpl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst); - - return DD_OK; -} - -static ICOM_VTABLE(IDirect3D) d3dvt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirect3DImpl_QueryInterface, - IDirect3DImpl_AddRef, - IDirect3DImpl_Release, - IDirect3DImpl_Initialize, - IDirect3DImpl_EnumDevices, - IDirect3DImpl_CreateLight, - IDirect3DImpl_CreateMaterial, - IDirect3DImpl_CreateViewport, - IDirect3DImpl_FindDevice -}; - -/******************************************************************************* - * IDirect3D2 - */ -static HRESULT WINAPI IDirect3D2Impl_QueryInterface( - LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) { - ICOM_THIS(IDirect3D2Impl,iface); - - /* FIXME: Not sure if this is correct */ - - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); - if ( ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) || - ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) || - ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) { - *obj = This->ddraw; - IDirect3D2_AddRef(iface); - - TRACE(" Creating IDirectDrawX interface (%p)\n", *obj); - - return S_OK; - } - if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) || - ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) { - *obj = This; - IDirect3D2_AddRef(iface); - - TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) { - IDirect3DImpl* d3d; - - d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); - d3d->ref = 1; - d3d->ddraw = This->ddraw; - IDirect3D2_AddRef(iface); - ICOM_VTBL(d3d) = &d3dvt; - *obj = d3d; - - TRACE(" Creating IDirect3D interface (%p)\n", *obj); - - return S_OK; - } - FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); - return OLE_E_ENUM_NOMORE; -} - -static ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) { - ICOM_THIS(IDirect3D2Impl,iface); - TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); - - return ++(This->ref); -} - -static ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface) { - ICOM_THIS(IDirect3D2Impl,iface); - TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); - - if (!--(This->ref)) { - IDirectDraw2_Release((IDirectDraw2*)This->ddraw); - HeapFree(GetProcessHeap(),0,This); - return S_OK; - } - return This->ref; -} - -static HRESULT WINAPI IDirect3D2Impl_EnumDevices( - LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context -) { - ICOM_THIS(IDirect3D2Impl,iface); - FIXME("(%p)->(%p,%p),stub!\n",This,cb,context); - - /* Call functions defined in d3ddevices.c */ - if (!d3d_OpenGL(cb, context)) - return DD_OK; - - return DD_OK; -} - -static HRESULT WINAPI IDirect3D2Impl_CreateLight(LPDIRECT3D2 iface, - LPDIRECT3DLIGHT *lplight, - IUnknown *lpunk) -{ - ICOM_THIS(IDirect3D2Impl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk); - - /* Call the creation function that is located in d3dlight.c */ - *lplight = d3dlight_create(This); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3D2Impl_CreateMaterial(LPDIRECT3D2 iface, - LPDIRECT3DMATERIAL2 *lpmaterial, - IUnknown *lpunk) -{ - ICOM_THIS(IDirect3D2Impl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk); - - /* Call the creation function that is located in d3dviewport.c */ - *lpmaterial = d3dmaterial2_create(This); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3D2Impl_CreateViewport(LPDIRECT3D2 iface, - LPDIRECT3DVIEWPORT2 *lpviewport, - IUnknown *lpunk) -{ - ICOM_THIS(IDirect3D2Impl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk); - - /* Call the creation function that is located in d3dviewport.c */ - *lpviewport = d3dviewport2_create(This); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3D2Impl_FindDevice(LPDIRECT3D2 iface, - LPD3DFINDDEVICESEARCH lpfinddevsrc, - LPD3DFINDDEVICERESULT lpfinddevrst) -{ - ICOM_THIS(IDirect3D2Impl,iface); - TRACE("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst); - - return DD_OK; -} - -static HRESULT WINAPI IDirect3D2Impl_CreateDevice(LPDIRECT3D2 iface, - REFCLSID rguid, - LPDIRECTDRAWSURFACE surface, - LPDIRECT3DDEVICE2 *device) -{ - ICOM_THIS(IDirect3D2Impl,iface); - - FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device); - - if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) { - IDirect3D2_AddRef(iface); - return DD_OK; -} - - return DDERR_INVALIDPARAMS; -} - -static ICOM_VTABLE(IDirect3D2) d3d2vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - IDirect3D2Impl_QueryInterface, - IDirect3D2Impl_AddRef, - IDirect3D2Impl_Release, - IDirect3D2Impl_EnumDevices, - IDirect3D2Impl_CreateLight, - IDirect3D2Impl_CreateMaterial, - IDirect3D2Impl_CreateViewport, - IDirect3D2Impl_FindDevice, - IDirect3D2Impl_CreateDevice -}; - -/******************************************************************************* - * IDirectDraw - */ - -/* Used in conjunction with cbWndExtra for storage of the this ptr for the window. - * Please adjust allocation in Xlib_DirectDrawCreate if you store more data here. - */ -static HRESULT common_off_screen_CreateSurface(IDirectDraw2Impl* This, - IDirectDrawSurfaceImpl* lpdsf) -{ - int bpp; - - /* The surface was already allocated when entering in this function */ - TRACE("using system memory for a surface (%p) \n", lpdsf); - - if (lpdsf->s.surface_desc.dwFlags & DDSD_ZBUFFERBITDEPTH) { - /* This is a Z Buffer */ - TRACE("Creating Z-Buffer of %ld bit depth\n", lpdsf->s.surface_desc.u.dwZBufferBitDepth); - bpp = lpdsf->s.surface_desc.u.dwZBufferBitDepth / 8; - } else { - /* This is a standard image */ - if (!(lpdsf->s.surface_desc.dwFlags & DDSD_PIXELFORMAT)) { - /* No pixel format => use DirectDraw's format */ - lpdsf->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat; - lpdsf->s.surface_desc.dwFlags |= DDSD_PIXELFORMAT; - } - bpp = GET_BPP(lpdsf->s.surface_desc); - } - - if (lpdsf->s.surface_desc.dwFlags & DDSD_LPSURFACE) { - /* The surface was preallocated : seems that we have nothing to do :-) */ - ERR("Creates a surface that is already allocated : assuming this is an application bug !\n"); - } - - assert(bpp); - FIXME("using w=%ld, h=%ld, bpp=%d\n",lpdsf->s.surface_desc.dwWidth,lpdsf->s.surface_desc.dwHeight,bpp); - - lpdsf->s.surface_desc.dwFlags |= DDSD_PITCH|DDSD_LPSURFACE; - lpdsf->s.surface_desc.u1.lpSurface = - (LPBYTE)HeapAlloc(GetProcessHeap(),0,lpdsf->s.surface_desc.dwWidth * lpdsf->s.surface_desc.dwHeight * bpp); - lpdsf->s.surface_desc.lPitch = lpdsf->s.surface_desc.dwWidth * bpp; - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_CreateSurface( - LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk -) { - ICOM_THIS(IDirectDraw2Impl,iface); - IDirectDrawSurfaceImpl** ilpdsf=(IDirectDrawSurfaceImpl**)lpdsf; - int i, fbheight = This->e.dga.fb_height; - - TRACE("(%p)->(%p,%p,%p)\n",This,lpddsd,ilpdsf,lpunk); - if (TRACE_ON(ddraw)) { _dump_surface_desc(lpddsd); } - - *ilpdsf = (IDirectDrawSurfaceImpl*)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(IDirectDrawSurfaceImpl) - ); - IDirectDraw2_AddRef(iface); - - (*ilpdsf)->ref = 1; -#ifdef HAVE_LIBXXF86DGA2 - if (This->e.dga.version == 2) - ICOM_VTBL(*ilpdsf) = (ICOM_VTABLE(IDirectDrawSurface)*)&dga2_dds4vt; - else -#endif /* defined(HAVE_LIBXXF86DGA2) */ - ICOM_VTBL(*ilpdsf) = (ICOM_VTABLE(IDirectDrawSurface)*)&dga_dds4vt; - (*ilpdsf)->s.ddraw = This; - (*ilpdsf)->s.palette = NULL; - (*ilpdsf)->t.dga.fb_height = -1; /* This is to have non-on screen surfaces freed */ - (*ilpdsf)->s.lpClipper = NULL; - - /* Copy the surface description */ - (*ilpdsf)->s.surface_desc = *lpddsd; - - if (!(lpddsd->dwFlags & DDSD_WIDTH)) - (*ilpdsf)->s.surface_desc.dwWidth = This->d.width; - if (!(lpddsd->dwFlags & DDSD_HEIGHT)) - (*ilpdsf)->s.surface_desc.dwHeight = This->d.height; - - (*ilpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT; - - /* Check if this a 'primary surface' or not */ - if ((lpddsd->dwFlags & DDSD_CAPS) && - (lpddsd->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) { - /* This is THE primary surface => there is DGA-specific code */ - - /* First, store the surface description */ - (*ilpdsf)->s.surface_desc = *lpddsd; - - /* Find a viewport */ - for (i=0;i<32;i++) - if (!(This->e.dga.vpmask & (1<e.dga.vpmask|=(1<lPitch = (*ilpdsf)->s.surface_desc.lPitch = - This->e.dga.fb_width*PFGET_BPP(This->d.directdraw_pixelformat); - - (*ilpdsf)->s.surface_desc.u1.lpSurface = - This->e.dga.fb_addr + i*fbheight*lpddsd->lPitch; - - (*ilpdsf)->t.dga.fb_height = i*fbheight; - - /* Add flags if there were not present */ - (*ilpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT; - (*ilpdsf)->s.surface_desc.dwWidth = This->d.width; - (*ilpdsf)->s.surface_desc.dwHeight = This->d.height; - TRACE("primary surface: dwWidth=%ld, dwHeight=%ld, lPitch=%ld\n",This->d.width,This->d.height,lpddsd->lPitch); - /* We put our surface always in video memory */ - SDDSCAPS((*ilpdsf)) |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY; - (*ilpdsf)->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat; - (*ilpdsf)->s.chain = NULL; - - if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) { - IDirectDrawSurface4Impl* back; - int bbc; - - for (bbc=lpddsd->dwBackBufferCount;bbc--;) { - int i; - - back = (IDirectDrawSurface4Impl*)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(IDirectDrawSurface4Impl) - ); - IDirectDraw2_AddRef(iface); - back->ref = 1; - ICOM_VTBL(back) = (ICOM_VTABLE(IDirectDrawSurface4)*)&dga_dds4vt; - for (i=0;i<32;i++) - if (!(This->e.dga.vpmask & (1<e.dga.vpmask|=(1<t.dga.fb_height = i*fbheight; - /* Copy the surface description from the front buffer */ - back->s.surface_desc = (*ilpdsf)->s.surface_desc; - /* Change the parameters that are not the same */ - back->s.surface_desc.u1.lpSurface = - This->e.dga.fb_addr + i*fbheight*lpddsd->lPitch; - - back->s.ddraw = This; - /* Add relevant info to front and back buffers */ - /* FIXME: backbuffer/frontbuffer handling broken here, but - * will be fixed up in _Flip(). - */ - SDDSCAPS((*ilpdsf)) |= DDSCAPS_FRONTBUFFER; - SDDSCAPS(back) |= DDSCAPS_FLIP|DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY; - back->s.surface_desc.dwFlags &= ~DDSD_BACKBUFFERCOUNT; - SDDSCAPS(back) &= ~DDSCAPS_VISIBLE; - IDirectDrawSurface4_AddAttachedSurface((LPDIRECTDRAWSURFACE4)(*ilpdsf),(LPDIRECTDRAWSURFACE4)back); - } - } - } else { - /* There is no DGA-specific code here... - Go to the common surface creation function */ - return common_off_screen_CreateSurface(This, *ilpdsf); - } - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -#ifdef HAVE_LIBXXSHM -/* Error handlers for Image creation */ -static int XShmErrorHandler(Display *dpy, XErrorEvent *event) { - XShmErrorFlag = 1; - return 0; -} - -static XImage *create_xshmimage(IDirectDraw2Impl* This, IDirectDrawSurface4Impl* lpdsf) { - XImage *img; - int (*WineXHandler)(Display *, XErrorEvent *); - - img = TSXShmCreateImage(display, X11DRV_GetVisual(), - This->d.pixmap_depth, - ZPixmap, - NULL, - &(lpdsf->t.xlib.shminfo), - lpdsf->s.surface_desc.dwWidth, - lpdsf->s.surface_desc.dwHeight - ); - - if (img == NULL) { - FIXME("Couldn't create XShm image (due to X11 remote display or failure).\nReverting to standard X images !\n"); - This->e.xlib.xshm_active = 0; - return NULL; - } - - lpdsf->t.xlib.shminfo.shmid = shmget( IPC_PRIVATE, img->bytes_per_line * img->height, IPC_CREAT|0777 ); - if (lpdsf->t.xlib.shminfo.shmid < 0) { - FIXME("Couldn't create shared memory segment (due to X11 remote display or failure).\nReverting to standard X images !\n"); - This->e.xlib.xshm_active = 0; - TSXDestroyImage(img); - return NULL; - } - - lpdsf->t.xlib.shminfo.shmaddr = img->data = (char*)shmat(lpdsf->t.xlib.shminfo.shmid, 0, 0); - - if (img->data == (char *) -1) { - FIXME("Couldn't attach shared memory segment (due to X11 remote display or failure).\nReverting to standard X images !\n"); - This->e.xlib.xshm_active = 0; - TSXDestroyImage(img); - shmctl(lpdsf->t.xlib.shminfo.shmid, IPC_RMID, 0); - return NULL; - } - lpdsf->t.xlib.shminfo.readOnly = False; - - /* This is where things start to get trickier.... - * First, we flush the current X connections to be sure to catch all - * non-XShm related errors - */ - TSXSync(display, False); - /* Then we enter in the non-thread safe part of the tests */ - EnterCriticalSection( &X11DRV_CritSection ); - - /* Reset the error flag, sets our new error handler and try to attach - * the surface - */ - XShmErrorFlag = 0; - WineXHandler = XSetErrorHandler(XShmErrorHandler); - XShmAttach(display, &(lpdsf->t.xlib.shminfo)); - XSync(display, False); - - /* Check the error flag */ - if (XShmErrorFlag) { - /* An error occured */ - XFlush(display); - XShmErrorFlag = 0; - XDestroyImage(img); - shmdt(lpdsf->t.xlib.shminfo.shmaddr); - shmctl(lpdsf->t.xlib.shminfo.shmid, IPC_RMID, 0); - XSetErrorHandler(WineXHandler); - - FIXME("Couldn't attach shared memory segment to X server (due to X11 remote display or failure).\nReverting to standard X images !\n"); - This->e.xlib.xshm_active = 0; - - /* Leave the critical section */ - LeaveCriticalSection( &X11DRV_CritSection ); - return NULL; - } - /* Here, to be REALLY sure, I should do a XShmPutImage to check if - * this works, but it may be a bit overkill.... - */ - XSetErrorHandler(WineXHandler); - LeaveCriticalSection( &X11DRV_CritSection ); - - shmctl(lpdsf->t.xlib.shminfo.shmid, IPC_RMID, 0); - - if (This->d.pixel_convert != NULL) { - lpdsf->s.surface_desc.u1.lpSurface = HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - lpdsf->s.surface_desc.dwWidth * - lpdsf->s.surface_desc.dwHeight * - PFGET_BPP(This->d.directdraw_pixelformat) - ); - } else { - lpdsf->s.surface_desc.u1.lpSurface = img->data; - } - return img; -} -#endif /* HAVE_LIBXXSHM */ - -static XImage *create_ximage(IDirectDraw2Impl* This, IDirectDrawSurface4Impl* lpdsf) { - XImage *img = NULL; - void *img_data; - -#ifdef HAVE_LIBXXSHM - if (This->e.xlib.xshm_active) - img = create_xshmimage(This, lpdsf); - - if (img == NULL) { -#endif - /* Allocate surface memory */ - lpdsf->s.surface_desc.u1.lpSurface = HeapAlloc( - GetProcessHeap(),HEAP_ZERO_MEMORY, - lpdsf->s.surface_desc.dwWidth * - lpdsf->s.surface_desc.dwHeight * - PFGET_BPP(This->d.directdraw_pixelformat) - ); - - if (This->d.pixel_convert != NULL) { - img_data = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, - lpdsf->s.surface_desc.dwWidth * - lpdsf->s.surface_desc.dwHeight * - PFGET_BPP(This->d.screen_pixelformat) - ); - } else { - img_data = lpdsf->s.surface_desc.u1.lpSurface; - } - - /* In this case, create an XImage */ - img = TSXCreateImage(display, X11DRV_GetVisual(), - This->d.pixmap_depth, - ZPixmap, - 0, - img_data, - lpdsf->s.surface_desc.dwWidth, - lpdsf->s.surface_desc.dwHeight, - 32, - lpdsf->s.surface_desc.dwWidth* PFGET_BPP(This->d.screen_pixelformat) - ); -#ifdef HAVE_LIBXXSHM - } -#endif - if (This->d.pixel_convert != NULL) - lpdsf->s.surface_desc.lPitch = PFGET_BPP(This->d.directdraw_pixelformat) * lpdsf->s.surface_desc.dwWidth; - else - lpdsf->s.surface_desc.lPitch = img->bytes_per_line; - return img; -} - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_CreateSurface( - LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk -) { - ICOM_THIS(IDirectDraw2Impl,iface); - IDirectDrawSurfaceImpl** ilpdsf=(IDirectDrawSurfaceImpl**)lpdsf; - - TRACE("(%p)->CreateSurface(%p,%p,%p)\n", This,lpddsd,ilpdsf,lpunk); - - if (TRACE_ON(ddraw)) { _dump_surface_desc(lpddsd); } - - *ilpdsf = (IDirectDrawSurfaceImpl*)HeapAlloc( - GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl) - ); - - IDirectDraw2_AddRef(iface); - - (*ilpdsf)->s.ddraw = This; - (*ilpdsf)->ref = 1; - ICOM_VTBL(*ilpdsf) = (ICOM_VTABLE(IDirectDrawSurface)*)&xlib_dds4vt; - (*ilpdsf)->s.palette = NULL; - (*ilpdsf)->t.xlib.image = NULL; /* This is for off-screen buffers */ - (*ilpdsf)->s.lpClipper = NULL; - - /* Copy the surface description */ - (*ilpdsf)->s.surface_desc = *lpddsd; - - if (!(lpddsd->dwFlags & DDSD_WIDTH)) - (*ilpdsf)->s.surface_desc.dwWidth = This->d.width; - if (!(lpddsd->dwFlags & DDSD_HEIGHT)) - (*ilpdsf)->s.surface_desc.dwHeight = This->d.height; - (*ilpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT; - - /* Check if this a 'primary surface' or not */ - if ((lpddsd->dwFlags & DDSD_CAPS) && - (lpddsd->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) { - XImage *img; - - TRACE("using standard XImage for a primary surface (%p)\n", *ilpdsf); - /* Create the XImage */ - img = create_ximage(This, (IDirectDrawSurface4Impl*) *ilpdsf); - if (img == NULL) - return DDERR_OUTOFMEMORY; - (*ilpdsf)->t.xlib.image = img; - - /* Add flags if there were not present */ - (*ilpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT; - (*ilpdsf)->s.surface_desc.dwWidth = This->d.width; - (*ilpdsf)->s.surface_desc.dwHeight = This->d.height; - (*ilpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY; - (*ilpdsf)->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat; - - /* Check for backbuffers */ - if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) { - IDirectDrawSurface4Impl* back; - XImage *img; - int i; - - for (i=lpddsd->dwBackBufferCount;i--;) { - back = (IDirectDrawSurface4Impl*)HeapAlloc( - GetProcessHeap(),HEAP_ZERO_MEMORY, - sizeof(IDirectDrawSurface4Impl) - ); - - TRACE("allocated back-buffer (%p)\n", back); - - IDirectDraw2_AddRef(iface); - back->s.ddraw = This; - - back->ref = 1; - ICOM_VTBL(back) = (ICOM_VTABLE(IDirectDrawSurface4)*)&xlib_dds4vt; - /* Copy the surface description from the front buffer */ - back->s.surface_desc = (*ilpdsf)->s.surface_desc; - - /* Create the XImage */ - img = create_ximage(This, back); - if (img == NULL) - return DDERR_OUTOFMEMORY; - back->t.xlib.image = img; - - /* Add relevant info to front and back buffers */ - /* FIXME: backbuffer/frontbuffer handling broken here, but - * will be fixed up in _Flip(). - */ - SDDSCAPS((*ilpdsf)) |= DDSCAPS_FRONTBUFFER; - SDDSCAPS(back) |= DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP; - back->s.surface_desc.dwFlags &= ~DDSD_BACKBUFFERCOUNT; - SDDSCAPS(back) &= ~DDSCAPS_VISIBLE; - IDirectDrawSurface4_AddAttachedSurface((LPDIRECTDRAWSURFACE4)(*ilpdsf),(LPDIRECTDRAWSURFACE4)back); - } - } - } else { - /* There is no Xlib-specific code here... - Go to the common surface creation function */ - return common_off_screen_CreateSurface(This, *ilpdsf); - } - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_DuplicateSurface( - LPDIRECTDRAW2 iface,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst -) { - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p)->(%p,%p) simply copies\n",This,src,dst); - *dst = src; /* FIXME */ - return DD_OK; -} - -/* - * The Xlib Implementation tries to use the passed hwnd as drawing window, - * even when the approbiate bitmasks are not specified. - */ -static HRESULT WINAPI IDirectDraw2Impl_SetCooperativeLevel( - LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel -) { - ICOM_THIS(IDirectDraw2Impl,iface); - int i; - const struct { - int mask; - char *name; - } flags[] = { -#define FE(x) { x, #x}, - FE(DDSCL_FULLSCREEN) - FE(DDSCL_ALLOWREBOOT) - FE(DDSCL_NOWINDOWCHANGES) - FE(DDSCL_NORMAL) - FE(DDSCL_ALLOWMODEX) - FE(DDSCL_EXCLUSIVE) - FE(DDSCL_SETFOCUSWINDOW) - FE(DDSCL_SETDEVICEWINDOW) - FE(DDSCL_CREATEDEVICEWINDOW) -#undef FE - }; - - FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel); - if (TRACE_ON(ddraw)) { - DPRINTF(" - "); - for (i=0;id.mainWindow = hwnd; - - /* This will be overwritten in the case of Full Screen mode. - Windowed games could work with that :-) */ - if (hwnd) - { - WND *tmpWnd = WIN_FindWndPtr(hwnd); - This->d.drawable = X11DRV_WND_GetXWindow(tmpWnd); - WIN_ReleaseWndPtr(tmpWnd); - - if( !This->d.drawable ) { - This->d.drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window; - WIN_ReleaseDesktop(); - } - TRACE("Setting drawable to %ld\n", This->d.drawable); - } - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA2 -static HRESULT WINAPI DGA_IDirectDraw2Impl_SetCooperativeLevel( - LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel -) { - ICOM_THIS(IDirectDraw2Impl,iface); - HRESULT ret; - int evbase, erbase; - - ret = IDirectDraw2Impl_SetCooperativeLevel(iface, hwnd, cooplevel); - - if (This->e.dga.version != 2) { - return ret; - } else { - if (ret != DD_OK) - return ret; - - TSXDGAQueryExtension(display, &evbase, &erbase); - - /* Now, start handling of DGA events giving the handle to the DDraw window - as the window for which the event will be reported */ - TSXDGASelectInput(display, DefaultScreen(display), - KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask ); - X11DRV_EVENT_SetDGAStatus(hwnd, evbase); - - return DD_OK; - } -} -#endif - -/* Small helper to either use the cooperative window or create a new - * one (for mouse and keyboard input) and drawing in the Xlib implementation. - */ -static void _common_IDirectDrawImpl_SetDisplayMode(IDirectDrawImpl* This) { - RECT rect; - - /* Do destroy only our window */ - if (This->d.window && GetPropA(This->d.window,ddProp)) { - DestroyWindow(This->d.window); - This->d.window = 0; - } - /* Sanity check cooperative window before assigning it to drawing. */ - if ( IsWindow(This->d.mainWindow) && - IsWindowVisible(This->d.mainWindow) - ) { - /* if it does not fit, resize the cooperative window. - * and hope the app likes it - */ - GetWindowRect(This->d.mainWindow,&rect); - if ((((rect.right-rect.left) >= This->d.width) && - ((rect.bottom-rect.top) >= This->d.height)) - ) { - This->d.window = This->d.mainWindow; - /* SetWindowPos(This->d.mainWindow,HWND_TOPMOST,0,0,This->d.width,This->d.height,SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); */ - This->d.paintable = 1; - } - } - /* ... failed, create new one. */ - if (!This->d.window) { - This->d.window = CreateWindowExA( - 0, - "WINE_DirectDraw", - "WINE_DirectDraw", - WS_VISIBLE|WS_SYSMENU|WS_THICKFRAME, - 0,0, - This->d.width, - This->d.height, - 0, - 0, - 0, - NULL - ); - /*Store THIS with the window. We'll use it in the window procedure*/ - SetPropA(This->d.window,ddProp,(LONG)This); - ShowWindow(This->d.window,TRUE); - UpdateWindow(This->d.window); - } - SetFocus(This->d.window); -} - -static int _common_depth_to_pixelformat(DWORD depth, - DDPIXELFORMAT *pixelformat, - DDPIXELFORMAT *screen_pixelformat, - int *pix_depth) { - XVisualInfo *vi; - XPixmapFormatValues *pf; - XVisualInfo vt; - int nvisuals, npixmap, i; - int match = 0; - int index = -2; - - vi = TSXGetVisualInfo(display, VisualNoMask, &vt, &nvisuals); - pf = XListPixmapFormats(display, &npixmap); - - for (i = 0; i < npixmap; i++) { - if (pf[i].depth == depth) { - int j; - - for (j = 0; j < nvisuals; j++) { - if (vi[j].depth == pf[i].depth) { - pixelformat->dwSize = sizeof(*pixelformat); - if (depth == 8) { - pixelformat->dwFlags = DDPF_PALETTEINDEXED8|DDPF_RGB; - pixelformat->u1.dwRBitMask = 0; - pixelformat->u2.dwGBitMask = 0; - pixelformat->u3.dwBBitMask = 0; - } else { - pixelformat->dwFlags = DDPF_RGB; - pixelformat->u1.dwRBitMask = vi[j].red_mask; - pixelformat->u2.dwGBitMask = vi[j].green_mask; - pixelformat->u3.dwBBitMask = vi[j].blue_mask; - } - pixelformat->dwFourCC = 0; - pixelformat->u.dwRGBBitCount = pf[i].bits_per_pixel; - pixelformat->u4.dwRGBAlphaBitMask= 0; - - *screen_pixelformat = *pixelformat; - - if (pix_depth != NULL) - *pix_depth = vi[j].depth; - - match = 1; - index = -1; - - goto clean_up_and_exit; - } - } - - ERR("No visual corresponding to pixmap format !\n"); - } - } - - if (match == 0) { - /* We try now to find an emulated mode */ - int c; - - for (c = 0; c < sizeof(ModeEmulations) / sizeof(Convert); c++) { - if (ModeEmulations[c].dest.depth == depth) { - /* Found an emulation function, now tries to find a matching visual / pixel format pair */ - for (i = 0; i < npixmap; i++) { - if ((pf[i].depth == ModeEmulations[c].screen.depth) && - (pf[i].bits_per_pixel == ModeEmulations[c].screen.bpp)) { - int j; - - for (j = 0; j < nvisuals; j++) { - if (vi[j].depth == pf[i].depth) { - screen_pixelformat->dwSize = sizeof(*screen_pixelformat); - screen_pixelformat->dwFlags = DDPF_RGB; - screen_pixelformat->dwFourCC = 0; - screen_pixelformat->u.dwRGBBitCount = pf[i].bits_per_pixel; - screen_pixelformat->u1.dwRBitMask = vi[j].red_mask; - screen_pixelformat->u2.dwGBitMask = vi[j].green_mask; - screen_pixelformat->u3.dwBBitMask = vi[j].blue_mask; - screen_pixelformat->u4.dwRGBAlphaBitMask= 0; - - pixelformat->dwSize = sizeof(*pixelformat); - pixelformat->dwFourCC = 0; - if (depth == 8) { - pixelformat->dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; - pixelformat->u.dwRGBBitCount = 8; - pixelformat->u1.dwRBitMask = 0; - pixelformat->u2.dwGBitMask = 0; - pixelformat->u3.dwBBitMask = 0; - } else { - pixelformat->dwFlags = DDPF_RGB; - pixelformat->u.dwRGBBitCount = ModeEmulations[c].dest.bpp; - pixelformat->u1.dwRBitMask = ModeEmulations[c].dest.rmask; - pixelformat->u2.dwGBitMask = ModeEmulations[c].dest.gmask; - pixelformat->u3.dwBBitMask = ModeEmulations[c].dest.bmask; - } - pixelformat->u4.dwRGBAlphaBitMask= 0; - - if (pix_depth != NULL) - *pix_depth = vi[j].depth; - - match = 2; - index = c; - - goto clean_up_and_exit; - } - - ERR("No visual corresponding to pixmap format !\n"); - } - } - } - } - } - } - - clean_up_and_exit: - TSXFree(vi); - TSXFree(pf); - - return index; -} - -#ifdef HAVE_LIBXXF86DGA2 -static void _DGA_Initialize_FrameBuffer(IDirectDrawImpl *This, int mode) { - DDPIXELFORMAT *pf = &(This->d.directdraw_pixelformat); - - /* Now, get the device / mode description */ - This->e.dga.dev = TSXDGASetMode(display, DefaultScreen(display), mode); - - This->e.dga.fb_width = This->e.dga.dev->mode.imageWidth; - TSXDGASetViewport(display,DefaultScreen(display),0,0, XDGAFlipImmediate); - This->e.dga.fb_height = This->e.dga.dev->mode.viewportHeight; - TRACE("video framebuffer: begin %p, width %d, memsize %d\n", - This->e.dga.dev->data, - This->e.dga.dev->mode.imageWidth, - (This->e.dga.dev->mode.imageWidth * - This->e.dga.dev->mode.imageHeight * - (This->e.dga.dev->mode.bitsPerPixel / 8)) - ); - TRACE("viewport height: %d\n", This->e.dga.dev->mode.viewportHeight); - /* Get the screen dimensions as seen by Wine. - In that case, it may be better to ignore the -desktop mode and return the - real screen size => print a warning */ - This->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); - This->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); - This->e.dga.fb_addr = This->e.dga.dev->data; - This->e.dga.fb_memsize = (This->e.dga.dev->mode.imageWidth * - This->e.dga.dev->mode.imageHeight * - (This->e.dga.dev->mode.bitsPerPixel / 8)); - This->e.dga.vpmask = 0; - - /* Fill the screen pixelformat */ - pf->dwSize = sizeof(DDPIXELFORMAT); - pf->dwFourCC = 0; - pf->u.dwRGBBitCount = This->e.dga.dev->mode.bitsPerPixel; - if (This->e.dga.dev->mode.depth == 8) { - pf->dwFlags = DDPF_PALETTEINDEXED8|DDPF_RGB; - pf->u1.dwRBitMask = 0; - pf->u2.dwGBitMask = 0; - pf->u3.dwBBitMask = 0; - } else { - pf->dwFlags = DDPF_RGB; - pf->u1.dwRBitMask = This->e.dga.dev->mode.redMask; - pf->u2.dwGBitMask = This->e.dga.dev->mode.greenMask; - pf->u3.dwBBitMask = This->e.dga.dev->mode.blueMask; - } - pf->u4.dwRGBAlphaBitMask= 0; - - This->d.screen_pixelformat = *pf; -} -#endif /* defined(HAVE_LIBXXF86DGA2) */ - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDrawImpl_SetDisplayMode( - LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth -) { - ICOM_THIS(IDirectDrawImpl,iface); - int i,mode_count; - - TRACE("(%p)->(%ld,%ld,%ld)\n", This, width, height, depth); - -#ifdef HAVE_LIBXXF86DGA2 - if (This->e.dga.version == 2) { - XDGAMode *modes = This->e.dga.modes; - int mode_to_use = -1; - - /* Search in the list a display mode that corresponds to what is requested */ - for (i = 0; i < This->e.dga.num_modes; i++) { - if ((height == modes[i].viewportHeight) && - (width == modes[i].viewportWidth) && - (depth == modes[i].depth)) { - mode_to_use = modes[i].num; - } - } - - if (mode_to_use < 0) { - ERR("Could not find matching mode !!!\n"); - return DDERR_UNSUPPORTEDMODE; - } else { - TRACE("Using mode number %d\n", mode_to_use); - - TSXDGACloseFramebuffer(display, DefaultScreen(display)); - - if (!TSXDGAOpenFramebuffer(display, DefaultScreen(display))) { - ERR("Error opening the frame buffer !!!\n"); - - return DDERR_GENERIC; - } - - /* Initialize the frame buffer */ - _DGA_Initialize_FrameBuffer(This, mode_to_use); - - /* Re-get (if necessary) the DGA events */ - TSXDGASelectInput(display, DefaultScreen(display), - KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask ); - } - - return DD_OK; - } -#endif /* defined(HAVE_LIBXXF86DGA2) */ - - /* We hope getting the asked for depth */ - if (_common_depth_to_pixelformat(depth, &(This->d.directdraw_pixelformat), &(This->d.screen_pixelformat), NULL) != -1) { - /* I.e. no visual found or emulated */ - ERR("(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth); - return DDERR_UNSUPPORTEDMODE; - } - - if (This->d.width < width) { - ERR("SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,This->d.width); - return DDERR_UNSUPPORTEDMODE; - } - This->d.width = width; - This->d.height = height; - - /* adjust fb_height, so we don't overlap */ - if (This->e.dga.fb_height < height) - This->e.dga.fb_height = height; - _common_IDirectDrawImpl_SetDisplayMode(This); - -#ifdef HAVE_LIBXXF86VM -#ifdef HAVE_LIBXXF86DGA2 - if (This->e.dga.version == 1) /* Only for DGA 1.0, it crashes with DGA 2.0 */ -#endif /* defined(HAVE_LIBXXF86DGA2) */ - { - XF86VidModeModeInfo **all_modes, *vidmode = NULL; - XF86VidModeModeLine mod_tmp; - /* int dotclock_tmp; */ - - /* save original video mode and set fullscreen if available*/ - orig_mode = (XF86VidModeModeInfo *) malloc (sizeof(XF86VidModeModeInfo)); - TSXF86VidModeGetModeLine(display, DefaultScreen(display), &orig_mode->dotclock, &mod_tmp); - orig_mode->hdisplay = mod_tmp.hdisplay; - orig_mode->hsyncstart = mod_tmp.hsyncstart; - orig_mode->hsyncend = mod_tmp.hsyncend; - orig_mode->htotal = mod_tmp.htotal; - orig_mode->vdisplay = mod_tmp.vdisplay; - orig_mode->vsyncstart = mod_tmp.vsyncstart; - orig_mode->vsyncend = mod_tmp.vsyncend; - orig_mode->vtotal = mod_tmp.vtotal; - orig_mode->flags = mod_tmp.flags; - orig_mode->private = mod_tmp.private; - - TSXF86VidModeGetAllModeLines(display,DefaultScreen(display),&mode_count,&all_modes); - for (i=0;ihdisplay == width && all_modes[i]->vdisplay == height) - { - vidmode = (XF86VidModeModeInfo *)malloc(sizeof(XF86VidModeModeInfo)); - *vidmode = *(all_modes[i]); - break; - } else - TSXFree(all_modes[i]->private); - } - for (i++;iprivate); - TSXFree(all_modes); - - if (!vidmode) - WARN("Fullscreen mode not available!\n"); - - if (vidmode) - { - TRACE("SwitchToMode(%dx%d)\n",vidmode->hdisplay,vidmode->vdisplay); - TSXF86VidModeSwitchToMode(display, DefaultScreen(display), vidmode); -#if 0 /* This messes up my screen (XF86_Mach64, 3.3.2.3a) for some reason, and should now be unnecessary */ - TSXF86VidModeSetViewPort(display, DefaultScreen(display), 0, 0); -#endif - } - } -#endif - - /* FIXME: this function OVERWRITES several signal handlers. - * can we save them? and restore them later? In a way that - * it works for the library too? - */ - TSXF86DGADirectVideo(display,DefaultScreen(display),XF86DGADirectGraphics); - TSXF86DGASetViewPort(display,DefaultScreen(display),0,0); - -#ifdef RESTORE_SIGNALS - SIGNAL_Init(); -#endif - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -/* ************************************* - 16 / 15 bpp to palettized 8 bpp - ************************************* */ -static void pixel_convert_16_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) { - unsigned char *c_src = (unsigned char *) src; - unsigned short *c_dst = (unsigned short *) dst; - int y; - - if (palette != NULL) { - const unsigned short * pal = (unsigned short *) palette->screen_palents; - - for (y = height; y--; ) { -#if defined(__i386__) && defined(__GNUC__) - /* gcc generates slightly inefficient code for the the copy / lookup, - * it generates one excess memory access (to pal) per pixel. Since - * we know that pal is not modified by the memory write we can - * put it into a register and reduce the number of memory accesses - * from 4 to 3 pp. There are two xor eax,eax to avoid pipeline stalls. - * (This is not guaranteed to be the fastest method.) - */ - __asm__ __volatile__( - "xor %%eax,%%eax\n" - "1:\n" - " lodsb\n" - " movw (%%edx,%%eax,2),%%ax\n" - " stosw\n" - " xor %%eax,%%eax\n" - " loop 1b\n" - : "=S" (c_src), "=D" (c_dst) - : "S" (c_src), "D" (c_dst) , "c" (width), "d" (pal) - : "eax", "cc", "memory" - ); - c_src+=(pitch-width); -#else - unsigned char * srclineend = c_src+width; - while (c_src < srclineend) - *c_dst++ = pal[*c_src++]; - c_src+=(pitch-width); -#endif - } - } else { - WARN("No palette set...\n"); - memset(dst, 0, width * height * 2); - } -} -static void palette_convert_16_to_8(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count) { - int i; - unsigned short *pal = (unsigned short *) screen_palette; - - for (i = 0; i < count; i++) - pal[start + i] = (((((unsigned short) palent[i].peRed) & 0xF8) << 8) | - ((((unsigned short) palent[i].peBlue) & 0xF8) >> 3) | - ((((unsigned short) palent[i].peGreen) & 0xFC) << 3)); -} -static void palette_convert_15_to_8(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count) { - int i; - unsigned short *pal = (unsigned short *) screen_palette; - - for (i = 0; i < count; i++) - pal[start + i] = (((((unsigned short) palent[i].peRed) & 0xF8) << 7) | - ((((unsigned short) palent[i].peBlue) & 0xF8) >> 3) | - ((((unsigned short) palent[i].peGreen) & 0xF8) << 2)); -} - -/* ************************************* - 24 to palettized 8 bpp - ************************************* */ -static void pixel_convert_24_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) { - unsigned char *c_src = (unsigned char *) src; - unsigned char *c_dst = (unsigned char *) dst; - int y; - - if (palette != NULL) { - const unsigned int *pal = (unsigned int *) palette->screen_palents; - - for (y = height; y--; ) { - unsigned char * srclineend = c_src+width; - while (c_src < srclineend ) { - register long pixel = pal[*c_src++]; - *c_dst++ = pixel; - *c_dst++ = pixel>>8; - *c_dst++ = pixel>>16; - } - c_src+=(pitch-width); - } - } else { - WARN("No palette set...\n"); - memset(dst, 0, width * height * 4); - } -} -/* ************************************* - 32 bpp to palettized 8 bpp - ************************************* */ -static void pixel_convert_32_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) { - unsigned char *c_src = (unsigned char *) src; - unsigned int *c_dst = (unsigned int *) dst; - int y; - - if (palette != NULL) { - const unsigned int *pal = (unsigned int *) palette->screen_palents; - - for (y = height; y--; ) { -#if defined(__i386__) && defined(__GNUC__) - /* See comment in pixel_convert_16_to_8 */ - __asm__ __volatile__( - "xor %%eax,%%eax\n" - "1:\n" - " lodsb\n" - " movl (%%edx,%%eax,4),%%eax\n" - " stosl\n" - " xor %%eax,%%eax\n" - " loop 1b\n" - : "=S" (c_src), "=D" (c_dst) - : "S" (c_src), "D" (c_dst) , "c" (width), "d" (pal) - : "eax", "cc", "memory" - ); - c_src+=(pitch-width); -#else - unsigned char * srclineend = c_src+width; - while (c_src < srclineend ) - *c_dst++ = pal[*c_src++]; - c_src+=(pitch-width); -#endif - } - } else { - WARN("No palette set...\n"); - memset(dst, 0, width * height * 4); - } -} - -static void palette_convert_24_to_8(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count) { - int i; - unsigned int *pal = (unsigned int *) screen_palette; - - for (i = 0; i < count; i++) - pal[start + i] = ((((unsigned int) palent[i].peRed) << 16) | - (((unsigned int) palent[i].peGreen) << 8) | - ((unsigned int) palent[i].peBlue)); -} - -/* ************************************* - 32 bpp to 16 bpp - ************************************* */ -static void pixel_convert_32_to_16(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) { - unsigned short *c_src = (unsigned short *) src; - unsigned int *c_dst = (unsigned int *) dst; - int y; - - for (y = height; y--; ) { - unsigned short * srclineend = c_src+width; - while (c_src < srclineend ) { - *c_dst++ = (((*c_src & 0xF800) << 8) | - ((*c_src & 0x07E0) << 5) | - ((*c_src & 0x001F) << 3)); - c_src++; - } - c_src+=((pitch/2)-width); - } -} - - -static HRESULT WINAPI Xlib_IDirectDrawImpl_SetDisplayMode( - LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth -) { - ICOM_THIS(IDirectDrawImpl,iface); - char buf[200]; - WND *tmpWnd; - int c; - - TRACE("(%p)->SetDisplayMode(%ld,%ld,%ld)\n", - This, width, height, depth); - - switch ((c = _common_depth_to_pixelformat(depth, - &(This->d.directdraw_pixelformat), - &(This->d.screen_pixelformat), - &(This->d.pixmap_depth)))) { - case -2: - sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width,height,depth); - MessageBoxA(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP); - return DDERR_UNSUPPORTEDMODE; - - case -1: - /* No convertion */ - This->d.pixel_convert = NULL; - This->d.palette_convert = NULL; - break; - - default: - WARN("Warning : running in depth-convertion mode. Should run using a %ld depth for optimal performances.\n", depth); - - /* Set the depth convertion routines */ - This->d.pixel_convert = ModeEmulations[c].funcs.pixel_convert; - This->d.palette_convert = ModeEmulations[c].funcs.palette_convert; - } - - This->d.width = width; - This->d.height = height; - - _common_IDirectDrawImpl_SetDisplayMode(This); - - tmpWnd = WIN_FindWndPtr(This->d.window); - This->d.paintable = 1; - This->d.drawable = ((X11DRV_WND_DATA *) tmpWnd->pDriverData)->window; - WIN_ReleaseWndPtr(tmpWnd); - - /* We don't have a context for this window. Host off the desktop */ - if( !This->d.drawable ) - { - This->d.drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window; - WIN_ReleaseDesktop(); - } - TRACE("Setting drawable to %ld\n", This->d.drawable); - - if (get_option( "DXGrab", 0 )) { - /* Confine cursor movement (risky, but the user asked for it) */ - TSXGrabPointer(display, This->d.drawable, True, 0, GrabModeAsync, GrabModeAsync, This->d.drawable, None, CurrentTime); - } - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_GetCaps( - LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2 -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->GetCaps(%p,%p)\n",This,caps1,caps2); - if (!caps1 && !caps2) - return DDERR_INVALIDPARAMS; - if (caps1) { - caps1->dwVidMemTotal = This->e.dga.fb_memsize; - caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED); /* we can do anything */ - caps1->ddsCaps.dwCaps = 0xffffffff; /* we can do anything */ - } - if (caps2) { - caps2->dwVidMemTotal = This->e.dga.fb_memsize; - caps2->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED); /* we can do anything */ - caps2->ddsCaps.dwCaps = 0xffffffff; /* we can do anything */ - } - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static void fill_caps(LPDDCAPS caps) { - /* This function tries to fill the capabilities of Wine's DDraw implementation. - Need to be fixed, though.. */ - if (caps == NULL) - return; - - caps->dwSize = sizeof(*caps); - caps->dwCaps = DDCAPS_ALPHA | DDCAPS_BLT | DDCAPS_BLTSTRETCH | DDCAPS_BLTCOLORFILL | DDCAPS_BLTDEPTHFILL | DDCAPS_CANBLTSYSMEM | DDCAPS_COLORKEY | DDCAPS_PALETTE | DDCAPS_NOHARDWARE; - caps->dwCaps2 = DDCAPS2_CERTIFIED | DDCAPS2_NOPAGELOCKREQUIRED | DDCAPS2_WIDESURFACES; - caps->dwCKeyCaps = 0xFFFFFFFF; /* Should put real caps here one day... */ - caps->dwFXCaps = 0; - caps->dwFXAlphaCaps = 0; - caps->dwPalCaps = DDPCAPS_8BIT | DDPCAPS_ALLOW256; - caps->dwSVCaps = 0; - caps->dwZBufferBitDepths = DDBD_16; - /* I put here 8 Mo so that D3D applications will believe they have enough memory - to put textures in video memory. - BTW, is this only frame buffer memory or also texture memory (for Voodoo boards - for example) ? */ - caps->dwVidMemTotal = 8192 * 1024; - caps->dwVidMemFree = 8192 * 1024; - /* These are all the supported capabilities of the surfaces */ - caps->ddsCaps.dwCaps = DDSCAPS_ALPHA | DDSCAPS_BACKBUFFER | DDSCAPS_COMPLEX | DDSCAPS_FLIP | - DDSCAPS_FRONTBUFFER | DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM | DDSCAPS_OFFSCREENPLAIN | - DDSCAPS_OVERLAY | DDSCAPS_PALETTE | DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY | - DDSCAPS_VIDEOMEMORY | DDSCAPS_VISIBLE; -#ifdef HAVE_MESAGL - caps->dwCaps |= DDCAPS_3D | DDCAPS_ZBLTS; - caps->dwCaps2 |= DDCAPS2_NO2DDURING3DSCENE; - caps->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE | DDSCAPS_MIPMAP | DDSCAPS_TEXTURE | DDSCAPS_ZBUFFER; -#endif -} - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetCaps( - LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2 -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->GetCaps(%p,%p)\n",This,caps1,caps2); - - /* Put the same caps for the two capabilities */ - fill_caps(caps1); - fill_caps(caps2); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_CreateClipper( - LPDIRECTDRAW2 iface,DWORD x,LPDIRECTDRAWCLIPPER *lpddclip,LPUNKNOWN lpunk -) { - ICOM_THIS(IDirectDraw2Impl,iface); - IDirectDrawClipperImpl** ilpddclip=(IDirectDrawClipperImpl**)lpddclip; - FIXME("(%p)->(%08lx,%p,%p),stub!\n", - This,x,ilpddclip,lpunk - ); - *ilpddclip = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipperImpl)); - (*ilpddclip)->ref = 1; - ICOM_VTBL(*ilpddclip) = &ddclipvt; - return DD_OK; -} - -static HRESULT WINAPI common_IDirectDraw2Impl_CreatePalette( - IDirectDraw2Impl* This,DWORD dwFlags,LPPALETTEENTRY palent,IDirectDrawPaletteImpl **lpddpal,LPUNKNOWN lpunk,int *psize -) { - int size = 0; - - if (TRACE_ON(ddraw)) - _dump_paletteformat(dwFlags); - - *lpddpal = (IDirectDrawPaletteImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPaletteImpl)); - if (*lpddpal == NULL) return E_OUTOFMEMORY; - (*lpddpal)->ref = 1; - (*lpddpal)->ddraw = (IDirectDrawImpl*)This; - (*lpddpal)->installed = 0; - - if (dwFlags & DDPCAPS_1BIT) - size = 2; - else if (dwFlags & DDPCAPS_2BIT) - size = 4; - else if (dwFlags & DDPCAPS_4BIT) - size = 16; - else if (dwFlags & DDPCAPS_8BIT) - size = 256; - else - ERR("unhandled palette format\n"); - *psize = size; - - if (palent) - { - /* Now, if we are in 'depth conversion mode', create the screen palette */ - if (This->d.palette_convert != NULL) - This->d.palette_convert(palent, (*lpddpal)->screen_palents, 0, size); - - memcpy((*lpddpal)->palents, palent, size * sizeof(PALETTEENTRY)); - } else if (This->d.palette_convert != NULL) { - /* In that case, put all 0xFF */ - memset((*lpddpal)->screen_palents, 0xFF, 256 * sizeof(int)); - } - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_CreatePalette( - LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk -) { - ICOM_THIS(IDirectDraw2Impl,iface); - IDirectDrawPaletteImpl** ilpddpal=(IDirectDrawPaletteImpl**)lpddpal; - HRESULT res; - int xsize = 0,i; - - TRACE("(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,ilpddpal,lpunk); - res = common_IDirectDraw2Impl_CreatePalette(This,dwFlags,palent,ilpddpal,lpunk,&xsize); - if (res != 0) return res; - ICOM_VTBL(*ilpddpal) = &dga_ddpalvt; - if (This->d.directdraw_pixelformat.u.dwRGBBitCount<=8) { - (*ilpddpal)->cm = TSXCreateColormap(display,DefaultRootWindow(display),X11DRV_GetVisual(),AllocAll); - } else { - FIXME("why are we doing CreatePalette in hi/truecolor?\n"); - (*ilpddpal)->cm = 0; - } - if (((*ilpddpal)->cm)&&xsize) { - for (i=0;ipalents[i].peRed<<8; - xc.blue = (*ilpddpal)->palents[i].peBlue<<8; - xc.green = (*ilpddpal)->palents[i].peGreen<<8; - xc.flags = DoRed|DoBlue|DoGreen; - xc.pixel = i; - TSXStoreColor(display,(*ilpddpal)->cm,&xc); - } - } - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_CreatePalette( - LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk -) { - ICOM_THIS(IDirectDraw2Impl,iface); - IDirectDrawPaletteImpl** ilpddpal=(IDirectDrawPaletteImpl**)lpddpal; - int xsize; - HRESULT res; - - TRACE("(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,ilpddpal,lpunk); - res = common_IDirectDraw2Impl_CreatePalette(This,dwFlags,palent,ilpddpal,lpunk,&xsize); - if (res != 0) return res; - ICOM_VTBL(*ilpddpal) = &xlib_ddpalvt; - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 iface) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->()\n",This); - Sleep(1000); - TSXF86DGADirectVideo(display,DefaultScreen(display),0); -#ifdef RESTORE_SIGNALS - SIGNAL_Init(); -#endif - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 iface) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->RestoreDisplayMode()\n", This); - Sleep(1000); - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_WaitForVerticalBlank( - LPDIRECTDRAW2 iface,DWORD x,HANDLE h -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->(0x%08lx,0x%08x)\n",This,x,h); - return DD_OK; -} - -static ULONG WINAPI IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); - - return ++(This->ref); -} - -#ifdef HAVE_LIBXXF86DGA -static ULONG WINAPI DGA_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); - - if (!--(This->ref)) { -#ifdef HAVE_LIBXXF86DGA2 - if (This->e.dga.version == 2) { - TRACE("Closing access to the FrameBuffer\n"); - TSXDGACloseFramebuffer(display, DefaultScreen(display)); - TRACE("Going back to normal X mode of operation\n"); - TSXDGASetMode(display, DefaultScreen(display), 0); - - /* Set the input handling back to absolute */ - X11DRV_EVENT_SetInputMehod(X11DRV_INPUT_ABSOLUTE); - - /* Remove the handling of DGA2 events */ - X11DRV_EVENT_SetDGAStatus(0, -1); - - /* Free the modes list */ - TSXFree(This->e.dga.modes); - } else -#endif /* defined(HAVE_LIBXXF86DGA2) */ - TSXF86DGADirectVideo(display,DefaultScreen(display),0); - if (This->d.window && GetPropA(This->d.window,ddProp)) - DestroyWindow(This->d.window); -#ifdef HAVE_LIBXXF86VM - if (orig_mode) { - TSXF86VidModeSwitchToMode( - display, - DefaultScreen(display), - orig_mode); - if (orig_mode->privsize) - TSXFree(orig_mode->private); - free(orig_mode); - orig_mode = NULL; - } -#endif - -#ifdef RESTORE_SIGNALS - SIGNAL_Init(); -#endif - HeapFree(GetProcessHeap(),0,This); - return S_OK; - } - return This->ref; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static ULONG WINAPI Xlib_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); - - if (!--(This->ref)) { - if (This->d.window && GetPropA(This->d.window,ddProp)) - DestroyWindow(This->d.window); - HeapFree(GetProcessHeap(),0,This); - return S_OK; - } - /* FIXME: destroy window ... */ - return This->ref; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_QueryInterface( - LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj -) { - ICOM_THIS(IDirectDraw2Impl,iface); - - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); - if ( IsEqualGUID( &IID_IUnknown, refiid ) ) { - *obj = This; - IDirectDraw2_AddRef(iface); - - TRACE(" Creating IUnknown interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) { - ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_ddvt; - IDirectDraw2_AddRef(iface); - *obj = This; - - TRACE(" Creating IDirectDraw interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) { - ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd2vt; - IDirectDraw2_AddRef(iface); - *obj = This; - - TRACE(" Creating IDirectDraw2 interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) { - ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd4vt; - IDirectDraw2_AddRef(iface); - *obj = This; - - TRACE(" Creating IDirectDraw4 interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) { - IDirect3DImpl* d3d; - - d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); - d3d->ref = 1; - d3d->ddraw = (IDirectDrawImpl*)This; - IDirectDraw2_AddRef(iface); - ICOM_VTBL(d3d) = &d3dvt; - *obj = d3d; - - TRACE(" Creating IDirect3D interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) { - IDirect3D2Impl* d3d; - - d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); - d3d->ref = 1; - d3d->ddraw = (IDirectDrawImpl*)This; - IDirectDraw2_AddRef(iface); - ICOM_VTBL(d3d) = &d3d2vt; - *obj = d3d; - - TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); - - return S_OK; - } - WARN("(%p):interface for IID %s _NOT_ found!\n",This,debugstr_guid(refiid)); - return OLE_E_ENUM_NOMORE; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_QueryInterface( - LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj -) { - ICOM_THIS(IDirectDraw2Impl,iface); - - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); - if ( IsEqualGUID( &IID_IUnknown, refiid ) ) { - *obj = This; - IDirectDraw2_AddRef(iface); - - TRACE(" Creating IUnknown interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) { - ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_ddvt; - IDirectDraw2_AddRef(iface); - *obj = This; - - TRACE(" Creating IDirectDraw interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) { - ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd2vt; - IDirectDraw2_AddRef(iface); - *obj = This; - - TRACE(" Creating IDirectDraw2 interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) { - ICOM_VTBL(This) = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd4vt; - IDirectDraw2_AddRef(iface); - *obj = This; - - TRACE(" Creating IDirectDraw4 interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) { - IDirect3DImpl* d3d; - - d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); - d3d->ref = 1; - d3d->ddraw = (IDirectDrawImpl*)This; - IDirectDraw2_AddRef(iface); - ICOM_VTBL(d3d) = &d3dvt; - *obj = d3d; - - TRACE(" Creating IDirect3D interface (%p)\n", *obj); - - return S_OK; - } - if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) { - IDirect3D2Impl* d3d; - - d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); - d3d->ref = 1; - d3d->ddraw = (IDirectDrawImpl*)This; - IDirectDraw2_AddRef(iface); - ICOM_VTBL(d3d) = &d3d2vt; - *obj = d3d; - - TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); - - return S_OK; - } - WARN("(%p):interface for IID %s _NOT_ found!\n",This,debugstr_guid(refiid)); - return OLE_E_ENUM_NOMORE; -} - -static HRESULT WINAPI IDirectDraw2Impl_GetVerticalBlankStatus( - LPDIRECTDRAW2 iface,BOOL *status -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->(%p)\n",This,status); - *status = TRUE; - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_EnumDisplayModes( - LPDIRECTDRAW2 iface,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb -) { - ICOM_THIS(IDirectDraw2Impl,iface); - DDSURFACEDESC ddsfd; - static struct { - int w,h; - } modes[5] = { /* some of the usual modes */ - {512,384}, - {640,400}, - {640,480}, - {800,600}, - {1024,768}, - }; - static int depths[4] = {8,16,24,32}; - int i,j; - - TRACE("(%p)->(0x%08lx,%p,%p,%p)\n",This,dwFlags,lpddsfd,context,modescb); - ddsfd.dwSize = sizeof(ddsfd); - ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; - if (dwFlags & DDEDM_REFRESHRATES) { - ddsfd.dwFlags |= DDSD_REFRESHRATE; - ddsfd.u.dwRefreshRate = 60; - } - ddsfd.ddsCaps.dwCaps = 0; - ddsfd.dwBackBufferCount = 1; - -#ifdef HAVE_LIBXXF86DGA2 - if (This->e.dga.version == 2) { - XDGAMode *modes = This->e.dga.modes; - - ddsfd.dwFlags |= DDSD_PITCH; - for (i = 0; i < This->e.dga.num_modes; i++) { - if (TRACE_ON(ddraw)) { - DPRINTF(" Enumerating mode %d : %s (FB: %dx%d / VP: %dx%d) - depth %d -", - modes[i].num, - modes[i].name, modes[i].imageWidth, modes[i].imageHeight, - modes[i].viewportWidth, modes[i].viewportHeight, - modes[i].depth); - if (modes[i].flags & XDGAConcurrentAccess) DPRINTF(" XDGAConcurrentAccess "); - if (modes[i].flags & XDGASolidFillRect) DPRINTF(" XDGASolidFillRect "); - if (modes[i].flags & XDGABlitRect) DPRINTF(" XDGABlitRect "); - if (modes[i].flags & XDGABlitTransRect) DPRINTF(" XDGABlitTransRect "); - if (modes[i].flags & XDGAPixmap) DPRINTF(" XDGAPixmap "); - DPRINTF("\n"); - } - /* Fill the pixel format */ - ddsfd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - ddsfd.ddpfPixelFormat.dwFourCC = 0; - ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; - ddsfd.ddpfPixelFormat.u.dwRGBBitCount = modes[i].bitsPerPixel; - if (modes[i].depth == 8) { - ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; - ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; - ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; - ddsfd.ddsCaps.dwCaps = DDSCAPS_PALETTE; - } else { - ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB; - ddsfd.ddpfPixelFormat.u1.dwRBitMask = modes[i].redMask; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = modes[i].greenMask; - ddsfd.ddpfPixelFormat.u3.dwBBitMask = modes[i].blueMask; - } - - ddsfd.dwWidth = modes[i].viewportWidth; - ddsfd.dwHeight = modes[i].viewportHeight; - ddsfd.lPitch = modes[i].imageWidth; - - /* Send mode to the application */ - if (!modescb(&ddsfd,context)) return DD_OK; - } - } else { -#endif - for (i=0;i 8 */ - if (depths[i]==8) { - ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; - ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; - ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; - ddsfd.ddsCaps.dwCaps=DDSCAPS_PALETTE; - ddsfd.ddpfPixelFormat.dwFlags|=DDPF_PALETTEINDEXED8; - } else { - ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; - - /* FIXME: We should query those from X itself */ - switch (depths[i]) { - case 16: - ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0xF800; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x07E0; - ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x001F; - break; - case 24: - ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0x00FF0000; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x0000FF00; - ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x000000FF; - break; - case 32: - ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0x00FF0000; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0x0000FF00; - ddsfd.ddpfPixelFormat.u3.dwBBitMask= 0x000000FF; - break; - } - } - - ddsfd.dwWidth = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); - ddsfd.dwHeight = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); - TRACE(" enumerating (%ldx%ldx%d)\n",ddsfd.dwWidth,ddsfd.dwHeight,depths[i]); - if (!modescb(&ddsfd,context)) return DD_OK; - - for (j=0;j(0x%08lx,%p,%p,%p)\n",This,dwFlags,lpddsfd,context,modescb); - ddsfd.dwSize = sizeof(ddsfd); - ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_CAPS|DDSD_PITCH; - if (dwFlags & DDEDM_REFRESHRATES) { - ddsfd.dwFlags |= DDSD_REFRESHRATE; - ddsfd.u.dwRefreshRate = 60; - } - maxWidth = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); - maxHeight = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); - - vi = TSXGetVisualInfo(display, VisualNoMask, &vt, &nvisuals); - pf = XListPixmapFormats(display, &npixmap); - - i = 0; - emu = 0; - while ((i < npixmap) || (emu != 4)) { - int mode_index = 0; - int send_mode = 0; - int j; - - if (i < npixmap) { - for (j = 0; j < 4; j++) { - if (has_depth[j] == pf[i].depth) { - mode_index = j; - break; - } - } - if (j == 4) { - i++; - continue; - } - - - if (has_mode[mode_index] == 0) { - if (mode_index == 0) { - send_mode = 1; - - ddsfd.ddsCaps.dwCaps = DDSCAPS_PALETTE; - ddsfd.ddpfPixelFormat.dwSize = sizeof(ddsfd.ddpfPixelFormat); - ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; - ddsfd.ddpfPixelFormat.dwFourCC = 0; - ddsfd.ddpfPixelFormat.u.dwRGBBitCount = 8; - ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; - ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; - ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; - - xbpp = 1; - - has_mode[mode_index] = 1; - } else { - /* All the 'true color' depths (15, 16 and 24) - First, find the corresponding visual to extract the bit masks */ - for (j = 0; j < nvisuals; j++) { - if (vi[j].depth == pf[i].depth) { - ddsfd.ddsCaps.dwCaps = 0; - ddsfd.ddpfPixelFormat.dwSize = sizeof(ddsfd.ddpfPixelFormat); - ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB; - ddsfd.ddpfPixelFormat.dwFourCC = 0; - ddsfd.ddpfPixelFormat.u.dwRGBBitCount = pf[i].bits_per_pixel; - ddsfd.ddpfPixelFormat.u1.dwRBitMask = vi[j].red_mask; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = vi[j].green_mask; - ddsfd.ddpfPixelFormat.u3.dwBBitMask = vi[j].blue_mask; - ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; - - xbpp = pf[i].bits_per_pixel/8; - - send_mode = 1; - has_mode[mode_index] = 1; - break; - } - } - if (j == nvisuals) - ERR("Did not find visual corresponding the the pixmap format !\n"); - } - } - i++; - } else { - /* Now to emulated modes */ - if (has_mode[emu] == 0) { - int c; - int l; - int depth = has_depth[emu]; - - for (c = 0; (c < sizeof(ModeEmulations) / sizeof(Convert)) && (send_mode == 0); c++) { - if (ModeEmulations[c].dest.depth == depth) { - /* Found an emulation function, now tries to find a matching visual / pixel format pair */ - for (l = 0; (l < npixmap) && (send_mode == 0); l++) { - if ((pf[l].depth == ModeEmulations[c].screen.depth) && - (pf[l].bits_per_pixel == ModeEmulations[c].screen.bpp)) { - int j; - for (j = 0; (j < nvisuals) && (send_mode == 0); j++) { - if ((vi[j].depth == pf[l].depth) && - (vi[j].red_mask == ModeEmulations[c].screen.rmask) && - (vi[j].green_mask == ModeEmulations[c].screen.gmask) && - (vi[j].blue_mask == ModeEmulations[c].screen.bmask)) { - ddsfd.ddpfPixelFormat.dwSize = sizeof(ddsfd.ddpfPixelFormat); - ddsfd.ddpfPixelFormat.dwFourCC = 0; - if (depth == 8) { - ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB|DDPF_PALETTEINDEXED8; - ddsfd.ddpfPixelFormat.u.dwRGBBitCount = 8; - ddsfd.ddpfPixelFormat.u1.dwRBitMask = 0; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = 0; - ddsfd.ddpfPixelFormat.u3.dwBBitMask = 0; - } else { - ddsfd.ddpfPixelFormat.dwFlags = DDPF_RGB; - ddsfd.ddpfPixelFormat.u.dwRGBBitCount = ModeEmulations[c].dest.bpp; - ddsfd.ddpfPixelFormat.u1.dwRBitMask = ModeEmulations[c].dest.rmask; - ddsfd.ddpfPixelFormat.u2.dwGBitMask = ModeEmulations[c].dest.gmask; - ddsfd.ddpfPixelFormat.u3.dwBBitMask = ModeEmulations[c].dest.bmask; - } - ddsfd.ddpfPixelFormat.u4.dwRGBAlphaBitMask= 0; - send_mode = 1; - } - - if (send_mode == 0) - ERR("No visual corresponding to pixmap format !\n"); - } - } - } - } - } - } - - emu++; - } - - if (send_mode) { - int mode; - - if (TRACE_ON(ddraw)) { - TRACE("Enumerating with pixel format : \n"); - _dump_pixelformat(&(ddsfd.ddpfPixelFormat)); - DPRINTF("\n"); - } - - for (mode = 0; mode < sizeof(modes)/sizeof(modes[0]); mode++) { - /* Do not enumerate modes we cannot handle anyway */ - if ((modes[mode].w > maxWidth) || (modes[mode].h > maxHeight)) - break; - - ddsfd.dwWidth = modes[mode].w; - ddsfd.dwHeight= modes[mode].h; - ddsfd.lPitch = ddsfd.dwWidth * xbpp; - - /* Now, send the mode description to the application */ - TRACE(" - mode %4ld - %4ld\n", ddsfd.dwWidth, ddsfd.dwHeight); - if (!modescb(&ddsfd, context)) - goto exit_enum; - } - - if (!(dwFlags & DDEDM_STANDARDVGAMODES)) { - /* modeX is not standard VGA */ - ddsfd.dwWidth = 320; - ddsfd.dwHeight = 200; - ddsfd.lPitch = 320 * xbpp; - if (!modescb(&ddsfd, context)) - goto exit_enum; - } - } - } - exit_enum: - TSXFree(vi); - TSXFree(pf); - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_GetDisplayMode( - LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsfd -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->(%p)\n",This,lpddsfd); - lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; - lpddsfd->dwHeight = This->d.height; - lpddsfd->dwWidth = This->d.width; - lpddsfd->lPitch = This->e.dga.fb_width*PFGET_BPP(This->d.directdraw_pixelformat); - lpddsfd->dwBackBufferCount = 2; - lpddsfd->u.dwRefreshRate = 60; - lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE; - lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat; - if (TRACE_ON(ddraw)) { - _dump_surface_desc(lpddsfd); - } - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetDisplayMode( - LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsfd -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->GetDisplayMode(%p)\n",This,lpddsfd); - lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS; - lpddsfd->dwHeight = This->d.height; - lpddsfd->dwWidth = This->d.width; - lpddsfd->lPitch = lpddsfd->dwWidth * PFGET_BPP(This->d.directdraw_pixelformat); - lpddsfd->dwBackBufferCount = 2; - lpddsfd->u.dwRefreshRate = 60; - lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE; - lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat; - if (TRACE_ON(ddraw)) { - _dump_surface_desc(lpddsfd); - } - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 iface) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->()\n",This); - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_GetMonitorFrequency( - LPDIRECTDRAW2 iface,LPDWORD freq -) { - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p)->(%p) returns 60 Hz always\n",This,freq); - *freq = 60*100; /* 60 Hz */ - return DD_OK; -} - -/* what can we directly decompress? */ -static HRESULT WINAPI IDirectDraw2Impl_GetFourCCCodes( - LPDIRECTDRAW2 iface,LPDWORD x,LPDWORD y -) { - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p,%p,%p), stub\n",This,x,y); - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_EnumSurfaces( - LPDIRECTDRAW2 iface,DWORD x,LPDDSURFACEDESC ddsfd,LPVOID context,LPDDENUMSURFACESCALLBACK ddsfcb -) { - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p)->(0x%08lx,%p,%p,%p),stub!\n",This,x,ddsfd,context,ddsfcb); - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_Compact( - LPDIRECTDRAW2 iface ) -{ - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p)->()\n", This ); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 iface, - LPDIRECTDRAWSURFACE *lplpGDIDDSSurface) { - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p)->(%p)\n", This, lplpGDIDDSSurface); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 iface, - LPDWORD lpdwScanLine) { - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p)->(%p)\n", This, lpdwScanLine); - - if (lpdwScanLine) - *lpdwScanLine = 0; - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, - GUID *lpGUID) { - ICOM_THIS(IDirectDraw2Impl,iface); - FIXME("(%p)->(%p)\n", This, lpGUID); - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA - -/* Note: Hack so we can reuse the old functions without compiler warnings */ -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(dga_ddvt.fn##fun)) -#else -# define XCAST(fun) (void *) -#endif - -static ICOM_VTABLE(IDirectDraw) dga_ddvt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)DGA_IDirectDraw2Impl_QueryInterface, - XCAST(AddRef)IDirectDraw2Impl_AddRef, - XCAST(Release)DGA_IDirectDraw2Impl_Release, - XCAST(Compact)IDirectDraw2Impl_Compact, - XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, - XCAST(CreatePalette)DGA_IDirectDraw2Impl_CreatePalette, - XCAST(CreateSurface)DGA_IDirectDraw2Impl_CreateSurface, - XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, - XCAST(EnumDisplayModes)DGA_IDirectDraw2Impl_EnumDisplayModes, - XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, - XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, - XCAST(GetCaps)DGA_IDirectDraw2Impl_GetCaps, - XCAST(GetDisplayMode)DGA_IDirectDraw2Impl_GetDisplayMode, - XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, - XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, - XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, - XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, - XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, - XCAST(Initialize)IDirectDraw2Impl_Initialize, - XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode, -#ifdef HAVE_LIBXXF86DGA2 - XCAST(SetCooperativeLevel)DGA_IDirectDraw2Impl_SetCooperativeLevel, -#else - XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel, -#endif - DGA_IDirectDrawImpl_SetDisplayMode, - XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, -}; - -#undef XCAST - -#endif /* defined(HAVE_LIBXXF86DGA) */ - -/* Note: Hack so we can reuse the old functions without compiler warnings */ -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(xlib_ddvt.fn##fun)) -#else -# define XCAST(fun) (void *) -#endif - -static ICOM_VTABLE(IDirectDraw) xlib_ddvt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface, - XCAST(AddRef)IDirectDraw2Impl_AddRef, - XCAST(Release)Xlib_IDirectDraw2Impl_Release, - XCAST(Compact)IDirectDraw2Impl_Compact, - XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, - XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette, - XCAST(CreateSurface)Xlib_IDirectDraw2Impl_CreateSurface, - XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, - XCAST(EnumDisplayModes)Xlib_IDirectDraw2Impl_EnumDisplayModes, - XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, - XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, - XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps, - XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode, - XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, - XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, - XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, - XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, - XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, - XCAST(Initialize)IDirectDraw2Impl_Initialize, - XCAST(RestoreDisplayMode)Xlib_IDirectDraw2Impl_RestoreDisplayMode, - XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel, - Xlib_IDirectDrawImpl_SetDisplayMode, - XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, -}; - -#undef XCAST - -/***************************************************************************** - * IDirectDraw2 - * - */ - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_SetDisplayMode( - LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth,DWORD dwRefreshRate, DWORD dwFlags -) { - FIXME( "Ignored parameters (0x%08lx,0x%08lx)\n", dwRefreshRate, dwFlags ); - return DGA_IDirectDrawImpl_SetDisplayMode((LPDIRECTDRAW)iface,width,height,depth); -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_SetDisplayMode( - LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth,DWORD dwRefreshRate,DWORD dwFlags -) { - FIXME( "Ignored parameters (0x%08lx,0x%08lx)\n", dwRefreshRate, dwFlags ); - return Xlib_IDirectDrawImpl_SetDisplayMode((LPDIRECTDRAW)iface,width,height,depth); -} - -#ifdef HAVE_LIBXXF86DGA -static HRESULT WINAPI DGA_IDirectDraw2Impl_GetAvailableVidMem( - LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->(%p,%p,%p)\n", - This,ddscaps,total,free - ); - if (total) *total = This->e.dga.fb_memsize * 1024; - if (free) *free = This->e.dga.fb_memsize * 1024; - return DD_OK; -} -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetAvailableVidMem( - LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free -) { - ICOM_THIS(IDirectDraw2Impl,iface); - TRACE("(%p)->(%p,%p,%p)\n", - This,ddscaps,total,free - ); - if (total) *total = 2048 * 1024; - if (free) *free = 2048 * 1024; - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA -static ICOM_VTABLE(IDirectDraw2) dga_dd2vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - DGA_IDirectDraw2Impl_QueryInterface, - IDirectDraw2Impl_AddRef, - DGA_IDirectDraw2Impl_Release, - IDirectDraw2Impl_Compact, - IDirectDraw2Impl_CreateClipper, - DGA_IDirectDraw2Impl_CreatePalette, - DGA_IDirectDraw2Impl_CreateSurface, - IDirectDraw2Impl_DuplicateSurface, - DGA_IDirectDraw2Impl_EnumDisplayModes, - IDirectDraw2Impl_EnumSurfaces, - IDirectDraw2Impl_FlipToGDISurface, - DGA_IDirectDraw2Impl_GetCaps, - DGA_IDirectDraw2Impl_GetDisplayMode, - IDirectDraw2Impl_GetFourCCCodes, - IDirectDraw2Impl_GetGDISurface, - IDirectDraw2Impl_GetMonitorFrequency, - IDirectDraw2Impl_GetScanLine, - IDirectDraw2Impl_GetVerticalBlankStatus, - IDirectDraw2Impl_Initialize, - DGA_IDirectDraw2Impl_RestoreDisplayMode, - IDirectDraw2Impl_SetCooperativeLevel, - DGA_IDirectDraw2Impl_SetDisplayMode, - IDirectDraw2Impl_WaitForVerticalBlank, - DGA_IDirectDraw2Impl_GetAvailableVidMem -}; -#endif /* defined(HAVE_LIBXXF86DGA) */ - -static ICOM_VTABLE(IDirectDraw2) xlib_dd2vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - Xlib_IDirectDraw2Impl_QueryInterface, - IDirectDraw2Impl_AddRef, - Xlib_IDirectDraw2Impl_Release, - IDirectDraw2Impl_Compact, - IDirectDraw2Impl_CreateClipper, - Xlib_IDirectDraw2Impl_CreatePalette, - Xlib_IDirectDraw2Impl_CreateSurface, - IDirectDraw2Impl_DuplicateSurface, - Xlib_IDirectDraw2Impl_EnumDisplayModes, - IDirectDraw2Impl_EnumSurfaces, - IDirectDraw2Impl_FlipToGDISurface, - Xlib_IDirectDraw2Impl_GetCaps, - Xlib_IDirectDraw2Impl_GetDisplayMode, - IDirectDraw2Impl_GetFourCCCodes, - IDirectDraw2Impl_GetGDISurface, - IDirectDraw2Impl_GetMonitorFrequency, - IDirectDraw2Impl_GetScanLine, - IDirectDraw2Impl_GetVerticalBlankStatus, - IDirectDraw2Impl_Initialize, - Xlib_IDirectDraw2Impl_RestoreDisplayMode, - IDirectDraw2Impl_SetCooperativeLevel, - Xlib_IDirectDraw2Impl_SetDisplayMode, - IDirectDraw2Impl_WaitForVerticalBlank, - Xlib_IDirectDraw2Impl_GetAvailableVidMem -}; - -/***************************************************************************** - * IDirectDraw4 - * - */ - -static HRESULT WINAPI IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 iface, - HDC hdc, - LPDIRECTDRAWSURFACE *lpDDS) { - ICOM_THIS(IDirectDraw4Impl,iface); - FIXME("(%p)->(%08ld,%p)\n", This, (DWORD) hdc, lpDDS); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 iface) { - ICOM_THIS(IDirectDraw4Impl,iface); - FIXME("(%p)->()\n", This); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 iface) { - ICOM_THIS(IDirectDraw4Impl,iface); - FIXME("(%p)->()\n", This); - - return DD_OK; -} - -static HRESULT WINAPI IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 iface, - LPDDDEVICEIDENTIFIER lpdddi, - DWORD dwFlags) { - ICOM_THIS(IDirectDraw4Impl,iface); - FIXME("(%p)->(%p,%08lx)\n", This, lpdddi, dwFlags); - - return DD_OK; -} - -#ifdef HAVE_LIBXXF86DGA - -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(dga_dd4vt.fn##fun)) -#else -# define XCAST(fun) (void*) -#endif - -static ICOM_VTABLE(IDirectDraw4) dga_dd4vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)DGA_IDirectDraw2Impl_QueryInterface, - XCAST(AddRef)IDirectDraw2Impl_AddRef, - XCAST(Release)DGA_IDirectDraw2Impl_Release, - XCAST(Compact)IDirectDraw2Impl_Compact, - XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, - XCAST(CreatePalette)DGA_IDirectDraw2Impl_CreatePalette, - XCAST(CreateSurface)DGA_IDirectDraw2Impl_CreateSurface, - XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, - XCAST(EnumDisplayModes)DGA_IDirectDraw2Impl_EnumDisplayModes, - XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, - XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, - XCAST(GetCaps)DGA_IDirectDraw2Impl_GetCaps, - XCAST(GetDisplayMode)DGA_IDirectDraw2Impl_GetDisplayMode, - XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, - XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, - XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, - XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, - XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, - XCAST(Initialize)IDirectDraw2Impl_Initialize, - XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode, - XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel, - XCAST(SetDisplayMode)DGA_IDirectDrawImpl_SetDisplayMode, - XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, - XCAST(GetAvailableVidMem)DGA_IDirectDraw2Impl_GetAvailableVidMem, - IDirectDraw4Impl_GetSurfaceFromDC, - IDirectDraw4Impl_RestoreAllSurfaces, - IDirectDraw4Impl_TestCooperativeLevel, - IDirectDraw4Impl_GetDeviceIdentifier -}; - -#undef XCAST - -#endif /* defined(HAVE_LIBXXF86DGA) */ - -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(xlib_dd4vt.fn##fun)) -#else -# define XCAST(fun) (void*) -#endif - -static ICOM_VTABLE(IDirectDraw4) xlib_dd4vt = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface, - XCAST(AddRef)IDirectDraw2Impl_AddRef, - XCAST(Release)Xlib_IDirectDraw2Impl_Release, - XCAST(Compact)IDirectDraw2Impl_Compact, - XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper, - XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette, - XCAST(CreateSurface)Xlib_IDirectDraw2Impl_CreateSurface, - XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface, - XCAST(EnumDisplayModes)Xlib_IDirectDraw2Impl_EnumDisplayModes, - XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces, - XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface, - XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps, - XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode, - XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes, - XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface, - XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency, - XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine, - XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus, - XCAST(Initialize)IDirectDraw2Impl_Initialize, - XCAST(RestoreDisplayMode)Xlib_IDirectDraw2Impl_RestoreDisplayMode, - XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel, - XCAST(SetDisplayMode)Xlib_IDirectDrawImpl_SetDisplayMode, - XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank, - XCAST(GetAvailableVidMem)Xlib_IDirectDraw2Impl_GetAvailableVidMem, - IDirectDraw4Impl_GetSurfaceFromDC, - IDirectDraw4Impl_RestoreAllSurfaces, - IDirectDraw4Impl_TestCooperativeLevel, - IDirectDraw4Impl_GetDeviceIdentifier -}; - -#undef XCAST - -/****************************************************************************** - * DirectDrawCreate - */ - -static LRESULT WINAPI Xlib_DDWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) -{ - LRESULT ret; - IDirectDrawImpl* ddraw = NULL; - DWORD lastError; - - /* FIXME(ddraw,"(0x%04x,%s,0x%08lx,0x%08lx),stub!\n",(int)hwnd,SPY_GetMsgName(msg),(long)wParam,(long)lParam); */ - - SetLastError( ERROR_SUCCESS ); - ddraw = (IDirectDrawImpl*)GetPropA( hwnd, ddProp ); - if( (!ddraw) && ( ( lastError = GetLastError() ) != ERROR_SUCCESS )) - { - ERR("Unable to retrieve this ptr from window. Error %08lx\n", lastError ); - } - - if( ddraw ) - { - /* Perform any special direct draw functions */ - if (msg==WM_PAINT) - ddraw->d.paintable = 1; - - /* Now let the application deal with the rest of this */ - if( ddraw->d.mainWindow ) - { - - /* Don't think that we actually need to call this but... - might as well be on the safe side of things... */ - - /* I changed hwnd to ddraw->d.mainWindow as I did not see why - it should be the procedures of our fake window that gets called - instead of those of the window provided by the application. - And with this patch, mouse clicks work with Monkey Island III - - Lionel */ - ret = DefWindowProcA( ddraw->d.mainWindow, msg, wParam, lParam ); - - if( !ret ) - { - WND *tmpWnd =WIN_FindWndPtr(ddraw->d.mainWindow); - /* We didn't handle the message - give it to the application */ - if (ddraw && ddraw->d.mainWindow && tmpWnd) - { - ret = CallWindowProcA(tmpWnd->winproc, - ddraw->d.mainWindow, msg, wParam, lParam ); - } - WIN_ReleaseWndPtr(tmpWnd); - - } - - } else { - ret = DefWindowProcA(hwnd, msg, wParam, lParam ); - } - - } - else - { - ret = DefWindowProcA(hwnd,msg,wParam,lParam); - } - - return ret; -} - -static HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) { -#ifdef HAVE_LIBXXF86DGA - IDirectDrawImpl** ilplpDD=(IDirectDrawImpl**)lplpDD; - int memsize,banksize,major,minor,flags; - char *addr; - int dga_version; - int width, height; - - /* Get DGA availability / version */ - dga_version = DDRAW_DGA_Available(); - - if (dga_version == 0) { - MessageBoxA(0,"Unable to initialize DGA.","WINE DirectDraw",MB_OK|MB_ICONSTOP); - return DDERR_GENERIC; - } - - *ilplpDD = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawImpl)); - (*ilplpDD)->ref = 1; - ICOM_VTBL(*ilplpDD) = &dga_ddvt; -#ifdef HAVE_LIBXXF86DGA2 - if (dga_version == 1) { - (*ilplpDD)->e.dga.version = 1; -#endif /* defined(HAVE_LIBXXF86DGA2) */ - TSXF86DGAQueryVersion(display,&major,&minor); - TRACE("XF86DGA is version %d.%d\n",major,minor); - TSXF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags); - if (!(flags & XF86DGADirectPresent)) - MESSAGE("direct video is NOT PRESENT.\n"); - TSXF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize); - (*ilplpDD)->e.dga.fb_width = width; - TSXF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height); - TSXF86DGASetViewPort(display,DefaultScreen(display),0,0); - (*ilplpDD)->e.dga.fb_height = height; - TRACE("video framebuffer: begin %p, width %d,banksize %d,memsize %d\n", - addr,width,banksize,memsize - ); - TRACE("viewport height: %d\n",height); - /* Get the screen dimensions as seen by Wine. - In that case, it may be better to ignore the -desktop mode and return the - real screen size => print a warning */ - (*ilplpDD)->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); - (*ilplpDD)->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); - if (((*ilplpDD)->d.height != height) || - ((*ilplpDD)->d.width != width)) - WARN("You seem to be running in -desktop mode. This may prove dangerous in DGA mode...\n"); - (*ilplpDD)->e.dga.fb_addr = addr; - (*ilplpDD)->e.dga.fb_memsize = memsize; - (*ilplpDD)->e.dga.vpmask = 0; - - /* just assume the default depth is the DGA depth too */ - _common_depth_to_pixelformat(X11DRV_GetDepth(), &((*ilplpDD)->d.directdraw_pixelformat), - &((*ilplpDD)->d.screen_pixelformat), NULL); -#ifdef RESTORE_SIGNALS - SIGNAL_Init(); -#endif -#ifdef HAVE_LIBXXF86DGA2 - } else { - XDGAMode *modes; - int i, num_modes; - int mode_to_use = 0; - - (*ilplpDD)->e.dga.version = 2; - - TSXDGAQueryVersion(display,&major,&minor); - TRACE("XDGA is version %d.%d\n",major,minor); - - TRACE("Opening the frame buffer.\n"); - if (!TSXDGAOpenFramebuffer(display, DefaultScreen(display))) { - ERR("Error opening the frame buffer !!!\n"); - - return DDERR_GENERIC; - } - - /* List all available modes */ - modes = TSXDGAQueryModes(display, DefaultScreen(display), &num_modes); - (*ilplpDD)->e.dga.modes = modes; - (*ilplpDD)->e.dga.num_modes = num_modes; - if (TRACE_ON(ddraw)) { - TRACE("Available modes :\n"); - for (i = 0; i < num_modes; i++) { - DPRINTF(" %d) - %s (FB: %dx%d / VP: %dx%d) - depth %d -", - modes[i].num, - modes[i].name, modes[i].imageWidth, modes[i].imageHeight, - modes[i].viewportWidth, modes[i].viewportHeight, - modes[i].depth); - if (modes[i].flags & XDGAConcurrentAccess) DPRINTF(" XDGAConcurrentAccess "); - if (modes[i].flags & XDGASolidFillRect) DPRINTF(" XDGASolidFillRect "); - if (modes[i].flags & XDGABlitRect) DPRINTF(" XDGABlitRect "); - if (modes[i].flags & XDGABlitTransRect) DPRINTF(" XDGABlitTransRect "); - if (modes[i].flags & XDGAPixmap) DPRINTF(" XDGAPixmap "); - DPRINTF("\n"); - - if ((MONITOR_GetHeight(&MONITOR_PrimaryMonitor) == modes[i].viewportHeight) && - (MONITOR_GetWidth(&MONITOR_PrimaryMonitor) == modes[i].viewportWidth) && - (MONITOR_GetDepth(&MONITOR_PrimaryMonitor) == modes[i].depth)) { - mode_to_use = modes[i].num; - } - } - } - if (mode_to_use == 0) { - ERR("Could not find mode !\n"); - mode_to_use = 1; - } else { - DPRINTF("Using mode number %d\n", mode_to_use); - } - - /* Initialize the frame buffer */ - _DGA_Initialize_FrameBuffer(*ilplpDD, mode_to_use); - /* Set the input handling for relative mouse movements */ - X11DRV_EVENT_SetInputMehod(X11DRV_INPUT_RELATIVE); - } -#endif /* defined(HAVE_LIBXXF86DGA2) */ - return DD_OK; -#else /* defined(HAVE_LIBXXF86DGA) */ - return DDERR_INVALIDDIRECTDRAWGUID; -#endif /* defined(HAVE_LIBXXF86DGA) */ -} - -static BOOL -DDRAW_XSHM_Available(void) -{ -#ifdef HAVE_LIBXXSHM - if (get_option( "UseXShm", 1 )) - { - if (TSXShmQueryExtension(display)) - { - int major, minor; - Bool shpix; - if (TSXShmQueryVersion(display, &major, &minor, &shpix)) return TRUE; - } - } -#endif - return FALSE; -} - -static HRESULT WINAPI Xlib_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) { - IDirectDrawImpl** ilplpDD=(IDirectDrawImpl**)lplpDD; - - *ilplpDD = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawImpl)); - ICOM_VTBL(*ilplpDD) = &xlib_ddvt; - (*ilplpDD)->ref = 1; - (*ilplpDD)->d.drawable = 0; /* in SetDisplayMode */ - - /* At DirectDraw creation, the depth is the default depth */ - _common_depth_to_pixelformat(X11DRV_GetDepth(), - &((*ilplpDD)->d.directdraw_pixelformat), - &((*ilplpDD)->d.screen_pixelformat), - &((*ilplpDD)->d.pixmap_depth)); - (*ilplpDD)->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); - (*ilplpDD)->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); - -#ifdef HAVE_LIBXXSHM - /* Test if XShm is available. */ - if (((*ilplpDD)->e.xlib.xshm_active = DDRAW_XSHM_Available())) { - (*ilplpDD)->e.xlib.xshm_compl = 0; - TRACE("Using XShm extension.\n"); - } -#endif - - return DD_OK; -} - -HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter ) { - IDirectDrawImpl** ilplpDD=(IDirectDrawImpl**)lplpDD; - WNDCLASSA wc; - /* WND* pParentWindow; */ - HRESULT ret; - - if (!HIWORD(lpGUID)) lpGUID = NULL; - - TRACE("(%s,%p,%p)\n",debugstr_guid(lpGUID),ilplpDD,pUnkOuter); - - if ( ( !lpGUID ) || - ( IsEqualGUID( &IID_IDirectDraw, lpGUID ) ) || - ( IsEqualGUID( &IID_IDirectDraw2, lpGUID ) ) || - ( IsEqualGUID( &IID_IDirectDraw4, lpGUID ) ) ) { - /* if they didn't request a particular interface, use the best - * supported one */ - if (DDRAW_DGA_Available()) - lpGUID = &DGA_DirectDraw_GUID; - else - lpGUID = &XLIB_DirectDraw_GUID; - } - - wc.style = CS_GLOBALCLASS; - wc.lpfnWndProc = Xlib_DDWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - - /* We can be a child of the desktop since we're really important */ - /* - This code is not useful since hInstance is forced to 0 afterward - pParentWindow = WIN_GetDesktop(); - wc.hInstance = pParentWindow ? pParentWindow->hwndSelf : 0; - */ - wc.hInstance = 0; - - - wc.hIcon = 0; - wc.hCursor = (HCURSOR)IDC_ARROWA; - wc.hbrBackground= NULL_BRUSH; - wc.lpszMenuName = 0; - wc.lpszClassName= "WINE_DirectDraw"; - RegisterClassA(&wc); - - if ( IsEqualGUID( &DGA_DirectDraw_GUID, lpGUID ) ) { - ret = DGA_DirectDrawCreate(lplpDD, pUnkOuter); - } - else if ( IsEqualGUID( &XLIB_DirectDraw_GUID, &XLIB_DirectDraw_GUID ) ) { - ret = Xlib_DirectDrawCreate(lplpDD, pUnkOuter); - } - else { - goto err; - } - - - (*ilplpDD)->d.winclass = RegisterClassA(&wc); - return ret; - - err: - ERR("DirectDrawCreate(%s,%p,%p): did not recognize requested GUID\n", - debugstr_guid(lpGUID),lplpDD,pUnkOuter); - return DDERR_INVALIDDIRECTDRAWGUID; -} - -/******************************************************************************* - * DirectDraw ClassFactory - * - * Heavily inspired (well, can you say completely copied :-) ) from DirectSound - * - */ -typedef struct -{ - /* IUnknown fields */ - ICOM_VFIELD(IClassFactory); - DWORD ref; -} IClassFactoryImpl; - -static HRESULT WINAPI -DDCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { - ICOM_THIS(IClassFactoryImpl,iface); - - FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); - return E_NOINTERFACE; -} - -static ULONG WINAPI -DDCF_AddRef(LPCLASSFACTORY iface) { - ICOM_THIS(IClassFactoryImpl,iface); - return ++(This->ref); -} - -static ULONG WINAPI DDCF_Release(LPCLASSFACTORY iface) { - ICOM_THIS(IClassFactoryImpl,iface); - /* static class, won't be freed */ - return --(This->ref); -} - -static HRESULT WINAPI DDCF_CreateInstance( - LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj -) { - ICOM_THIS(IClassFactoryImpl,iface); - - TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); - if ( ( IsEqualGUID( &IID_IDirectDraw, riid ) ) || - ( IsEqualGUID( &IID_IDirectDraw2, riid ) ) || - ( IsEqualGUID( &IID_IDirectDraw4, riid ) ) ) { - /* FIXME: reuse already created DirectDraw if present? */ - return DirectDrawCreate((LPGUID) riid,(LPDIRECTDRAW*)ppobj,pOuter); - } - return CLASS_E_CLASSNOTAVAILABLE; -} - -static HRESULT WINAPI DDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { - ICOM_THIS(IClassFactoryImpl,iface); - FIXME("(%p)->(%d),stub!\n",This,dolock); - return S_OK; -} - -static ICOM_VTABLE(IClassFactory) DDCF_Vtbl = -{ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - DDCF_QueryInterface, - DDCF_AddRef, - DDCF_Release, - DDCF_CreateInstance, - DDCF_LockServer -}; -static IClassFactoryImpl DDRAW_CF = {&DDCF_Vtbl, 1 }; - -/******************************************************************************* - * DllGetClassObject [DDRAW.13] - * Retrieves class object from a DLL object - * - * NOTES - * Docs say returns STDAPI - * - * PARAMS - * rclsid [I] CLSID for the class object - * riid [I] Reference to identifier of interface for class object - * ppv [O] Address of variable to receive interface pointer for riid - * - * RETURNS - * Success: S_OK - * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG, - * E_UNEXPECTED - */ -DWORD WINAPI DDRAW_DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppv) -{ - TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); - if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) { - *ppv = (LPVOID)&DDRAW_CF; - IClassFactory_AddRef((IClassFactory*)*ppv); - return S_OK; - } - FIXME("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); - return CLASS_E_CLASSNOTAVAILABLE; -} - - -/******************************************************************************* - * DllCanUnloadNow [DDRAW.12] Determines whether the DLL is in use. - * - * RETURNS - * Success: S_OK - * Failure: S_FALSE - */ -DWORD WINAPI DDRAW_DllCanUnloadNow(void) -{ - FIXME("(void): stub\n"); - return S_FALSE; -} - -#else /* !defined(X_DISPLAY_MISSING) */ - -#include "windef.h" -#include "wtypes.h" - -#define DD_OK 0 - -typedef void *LPUNKNOWN; -typedef void *LPDIRECTDRAW; -typedef void *LPDIRECTDRAWCLIPPER; -typedef void *LPDDENUMCALLBACKA; -typedef void *LPDDENUMCALLBACKEXA; -typedef void *LPDDENUMCALLBACKEXW; -typedef void *LPDDENUMCALLBACKW; - -/*********************************************************************** - * DSoundHelp - */ -HRESULT WINAPI DSoundHelp(DWORD x, DWORD y, DWORD z) -{ - return DD_OK; -} - -/*********************************************************************** - * DirectDrawCreate - */ -HRESULT WINAPI DirectDrawCreate( - LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) -{ - return DD_OK; -} - -/*********************************************************************** - * DirectDrawCreateClipper - */ -HRESULT WINAPI DirectDrawCreateClipper( - DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, LPUNKNOWN pUnkOuter) -{ - return DD_OK; -} - -/*********************************************************************** - * DirectDrawEnumerateA - */ -HRESULT WINAPI DirectDrawEnumerateA( - LPDDENUMCALLBACKA lpCallback, LPVOID lpContext) -{ - return DD_OK; -} - -/*********************************************************************** - * DirectDrawEnumerateExA - */ -HRESULT WINAPI DirectDrawEnumerateExA( - LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) -{ - return DD_OK; -} - -/*********************************************************************** - * DirectDrawEnumerateExW - */ -HRESULT WINAPI DirectDrawEnumerateExW( - LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) -{ - return DD_OK; -} - -/*********************************************************************** - * DirectDrawEnumerateW - */ -HRESULT WINAPI DirectDrawEnumerateW( - LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) -{ - return DD_OK; -} - -/*********************************************************************** - * DDRAW_DllGetClassObject - */ -DWORD WINAPI DDRAW_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) -{ - return CLASS_E_CLASSNOTAVAILABLE; -} - -/*********************************************************************** - * DDRAW_DllCanUnloadNow - */ -DWORD WINAPI DDRAW_DllCanUnloadNow(void) -{ - return DD_OK; -} - -#endif /* !defined(X_DISPLAY_MISSING) */ - - - - diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 2f9da90d0fa..a16a342160c 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -1,30 +1,192 @@ -#ifndef __GRAPHICS_WINE_DDRAW_PRIVATE_H -#define __GRAPHICS_WINE_DDRAW_PRIVATE_H +#ifndef __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H +#define __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H -#include "config.h" +/* MAY NOT CONTAIN X11 or DGA specific includes/defines/structs! */ -#ifdef HAVE_LIBXXF86DGA2 -#include "ts_xf86dga2.h" -#endif /* defined(HAVE_LIBXXF86DGA2) */ - -#include "ddraw.h" +#include "wtypes.h" +#include "winbase.h" +#include "wingdi.h" #include "winuser.h" +#include "ddraw.h" + +static WINE_UNUSED const char *ddProp = "WINE_DDRAW_Property"; + +/**************************************************************************** + * This is the main DirectDraw driver interface. It is supposed to be called + * only from the base functions and only used by those. It should neither be + * be called nor used within the interfaces. + */ +typedef struct ddraw_driver { + LPGUID guid; /*under which we are referenced and enumerated*/ + CHAR type[20]; /* type, usually "display" */ + CHAR name[40]; /* name, like "WINE Foobar DirectDraw Driver" */ + int preference; /* how good we are. dga might get 100, xlib 50*/ + HRESULT (*createDDRAW)(LPDIRECTDRAW*); /* also check if arg is NULL */ +} ddraw_driver; + +extern void ddraw_register_driver(ddraw_driver*); /***************************************************************************** - * Predeclare the interface implementation structures + * The implementation structures. They must not contain driver specific stuff. + * + * For private data the "LPVOID private" pointer should be used. */ -typedef struct IDirectDrawPaletteImpl IDirectDrawPaletteImpl; -typedef struct IDirectDrawClipperImpl IDirectDrawClipperImpl; -typedef struct IDirectDrawImpl IDirectDrawImpl; -typedef struct IDirectDraw2Impl IDirectDraw2Impl; -typedef struct IDirectDraw4Impl IDirectDraw4Impl; -typedef struct IDirectDrawSurfaceImpl IDirectDrawSurfaceImpl; -typedef struct IDirectDrawSurface3Impl IDirectDrawSurface2Impl; -typedef struct IDirectDrawSurface4Impl IDirectDrawSurface3Impl; -typedef struct IDirectDrawSurface4Impl IDirectDrawSurface4Impl; -typedef struct IDirectDrawColorControlImpl IDirectDrawColorControlImpl; -#include "d3d_private.h" +typedef struct IDirectDrawImpl IDirectDrawImpl; +typedef struct IDirectDraw2Impl IDirectDraw2Impl; +typedef struct IDirectDraw3Impl IDirectDraw3Impl; +typedef struct IDirectDraw4Impl IDirectDraw4Impl; +typedef struct IDirectDrawPaletteImpl IDirectDrawPaletteImpl; +typedef struct IDirectDrawClipperImpl IDirectDrawClipperImpl; + +typedef struct IDirectDrawSurfaceImpl IDirectDrawSurfaceImpl; +typedef struct IDirectDrawSurface2Impl IDirectDrawSurface2Impl; +typedef struct IDirectDrawSurface4Impl IDirectDrawSurface4Impl; + + +extern struct ICOM_VTABLE(IDirectDrawClipper) ddclipvt; +extern struct ICOM_VTABLE(IDirectDrawPalette) ddraw_ddpalvt; + +/***************************************************************************** + * IDirectDraw implementation structure + */ +struct _common_directdrawdata +{ + DDPIXELFORMAT directdraw_pixelformat; + DDPIXELFORMAT screen_pixelformat; + + int pixmap_depth; + void (*pixel_convert)(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl *palette); + void (*palette_convert)(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count); + DWORD height,width; /* set by SetDisplayMode */ + HWND mainWindow; /* set by SetCooperativeLevel */ + + /* This is for the fake mainWindow */ + ATOM winclass; + HWND window; + PAINTSTRUCT ps; + int paintable; +}; + +/***************************************************************************** + * IDirectDraw implementation structure + * + * Note: All the IDirectDraw*Impl structures _MUST_ have IDENTICAL layout, + * since we reuse functions across interface versions. + */ +struct IDirectDrawImpl +{ + /* IUnknown fields */ + ICOM_VFIELD(IDirectDraw); + DWORD ref; + /* IDirectDraw fields */ + struct _common_directdrawdata d; + LPVOID private; +}; +extern HRESULT WINAPI IDirectDrawImpl_SetDisplayMode( + LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth +); +/* + * IDirectDraw2 implementation structure + */ +struct IDirectDraw2Impl +{ + /* IUnknown fields */ + ICOM_VFIELD(IDirectDraw2); + DWORD ref; + + /* IDirectDraw2 fields */ + struct _common_directdrawdata d; + LPVOID private; +}; +extern HRESULT WINAPI IDirectDraw2Impl_DuplicateSurface( + LPDIRECTDRAW2 iface,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst +); +extern HRESULT WINAPI IDirectDraw2Impl_SetCooperativeLevel( + LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel +); +extern HRESULT WINAPI IDirectDraw2Impl_GetCaps( + LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2 +) ; +extern HRESULT WINAPI IDirectDraw2Impl_CreateClipper( + LPDIRECTDRAW2 iface,DWORD x,LPDIRECTDRAWCLIPPER *lpddclip,LPUNKNOWN lpunk +); +extern HRESULT WINAPI common_IDirectDraw2Impl_CreatePalette( + IDirectDraw2Impl* This,DWORD dwFlags,LPPALETTEENTRY palent, + IDirectDrawPaletteImpl **lpddpal,LPUNKNOWN lpunk,int *psize +); +extern HRESULT WINAPI IDirectDraw2Impl_CreatePalette( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk +); +extern HRESULT WINAPI IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 iface); +extern HRESULT WINAPI IDirectDraw2Impl_WaitForVerticalBlank( + LPDIRECTDRAW2 iface,DWORD x,HANDLE h +); +extern ULONG WINAPI IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface); +extern ULONG WINAPI IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface); +extern HRESULT WINAPI IDirectDraw2Impl_QueryInterface( + LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj +); +extern HRESULT WINAPI IDirectDraw2Impl_GetVerticalBlankStatus( + LPDIRECTDRAW2 iface,BOOL *status +); +extern HRESULT WINAPI IDirectDraw2Impl_EnumDisplayModes( + LPDIRECTDRAW2 iface,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb +); +extern HRESULT WINAPI IDirectDraw2Impl_GetDisplayMode( + LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsfd +); +extern HRESULT WINAPI IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 iface); +extern HRESULT WINAPI IDirectDraw2Impl_GetMonitorFrequency( + LPDIRECTDRAW2 iface,LPDWORD freq +); +extern HRESULT WINAPI IDirectDraw2Impl_GetFourCCCodes( + LPDIRECTDRAW2 iface,LPDWORD x,LPDWORD y +); +extern HRESULT WINAPI IDirectDraw2Impl_EnumSurfaces( + LPDIRECTDRAW2 iface,DWORD x,LPDDSURFACEDESC ddsfd,LPVOID context, + LPDDENUMSURFACESCALLBACK ddsfcb +); +extern HRESULT WINAPI IDirectDraw2Impl_Compact( LPDIRECTDRAW2 iface ); +extern HRESULT WINAPI IDirectDraw2Impl_GetGDISurface( + LPDIRECTDRAW2 iface, LPDIRECTDRAWSURFACE *lplpGDIDDSSurface +); +extern HRESULT WINAPI IDirectDraw2Impl_GetScanLine( + LPDIRECTDRAW2 iface, LPDWORD lpdwScanLine +); +extern HRESULT WINAPI IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, GUID *lpGUID); +extern HRESULT WINAPI IDirectDraw2Impl_SetDisplayMode( + LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth, + DWORD dwRefreshRate, DWORD dwFlags +); +extern HRESULT WINAPI IDirectDraw2Impl_GetAvailableVidMem( + LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free +); +extern HRESULT common_off_screen_CreateSurface( + IDirectDraw2Impl* This,IDirectDrawSurfaceImpl* lpdsf +); + +/* + * IDirectDraw4 implementation structure + */ +struct IDirectDraw4Impl +{ + /* IUnknown fields */ + ICOM_VFIELD(IDirectDraw4); + DWORD ref; + /* IDirectDraw4 fields */ + struct _common_directdrawdata d; + LPVOID private; +}; +extern HRESULT WINAPI IDirectDraw4Impl_GetSurfaceFromDC( + LPDIRECTDRAW4 iface, HDC hdc, LPDIRECTDRAWSURFACE *lpDDS +); +extern HRESULT WINAPI IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 iface); +extern HRESULT WINAPI IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 iface); +extern HRESULT WINAPI IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 iface, + LPDDDEVICEIDENTIFIER lpdddi, + DWORD dwFlags +); /***************************************************************************** * IDirectDrawPalette implementation structure @@ -33,15 +195,28 @@ struct IDirectDrawPaletteImpl { /* IUnknown fields */ ICOM_VFIELD(IDirectDrawPalette); - DWORD ref; + DWORD ref; + /* IDirectDrawPalette fields */ - IDirectDrawImpl* ddraw; - Colormap cm; - PALETTEENTRY palents[256]; - int installed; + IDirectDrawImpl* ddraw; /* direct draw, no referencecount */ + PALETTEENTRY palents[256]; + /* This is to store the palette in 'screen format' */ - int screen_palents[256]; + int screen_palents[256]; + LPVOID private; }; +extern HRESULT WINAPI IDirectDrawPaletteImpl_GetEntries(LPDIRECTDRAWPALETTE,DWORD,DWORD,DWORD,LPPALETTEENTRY); +extern HRESULT WINAPI IDirectDrawPaletteImpl_SetEntries(LPDIRECTDRAWPALETTE,DWORD,DWORD,DWORD,LPPALETTEENTRY); +extern ULONG WINAPI IDirectDrawPaletteImpl_Release(LPDIRECTDRAWPALETTE); +extern ULONG WINAPI IDirectDrawPaletteImpl_AddRef(LPDIRECTDRAWPALETTE); +extern HRESULT WINAPI IDirectDrawPaletteImpl_Initialize(LPDIRECTDRAWPALETTE,LPDIRECTDRAW,DWORD,LPPALETTEENTRY); +extern HRESULT WINAPI IDirectDrawPaletteImpl_GetCaps(LPDIRECTDRAWPALETTE,LPDWORD); +extern HRESULT WINAPI IDirectDrawPaletteImpl_QueryInterface(LPDIRECTDRAWPALETTE,REFIID,LPVOID *); + +extern HRESULT WINAPI common_IDirectDraw2Impl_CreatePalette( + IDirectDraw2Impl* This,DWORD dwFlags,LPPALETTEENTRY palent, + IDirectDrawPaletteImpl **lpddpal,LPUNKNOWN lpunk,int *psize +); /***************************************************************************** * IDirectDrawClipper implementation structure @@ -56,100 +231,10 @@ struct IDirectDrawClipperImpl HWND hWnd; }; -/***************************************************************************** - * IDirectDraw implementation structure - */ -struct _common_directdrawdata -{ - DDPIXELFORMAT directdraw_pixelformat; - DDPIXELFORMAT screen_pixelformat; - int pixmap_depth; - void (*pixel_convert)(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette); - void (*palette_convert)(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count); - DWORD height,width; /* SetDisplayMode */ - HWND mainWindow; /* SetCooperativeLevel */ - - /* This is for Wine's fake mainWindow. - We need it also in DGA mode to make some games (for example Monkey Island III work) */ - ATOM winclass; - HWND window; - Window drawable; - PAINTSTRUCT ps; - int paintable; -}; - -struct _dga_directdrawdata -{ - DWORD fb_width,fb_height,fb_memsize; - void* fb_addr; - unsigned int vpmask; -#ifdef HAVE_LIBXXF86DGA2 - int version; - XDGADevice *dev; - XDGAMode *modes; - int num_modes; -#endif /* define(HAVE_LIBXXF86DGA2) */ -}; - -struct _xlib_directdrawdata -{ -#ifdef HAVE_LIBXXSHM - int xshm_active, xshm_compl; -#endif /* defined(HAVE_LIBXXSHM) */ - - /* are these needed for anything? (draw_surf is the active surface) - IDirectDrawSurfaceImpl* surfs; - DWORD num_surfs, alloc_surfs, draw_surf; */ -}; - -struct IDirectDrawImpl -{ - /* IUnknown fields */ - ICOM_VFIELD(IDirectDraw); - DWORD ref; - /* IDirectDraw fields */ - struct _common_directdrawdata d; - union { - struct _xlib_directdrawdata xlib; - struct _dga_directdrawdata dga; - } e; -}; - -/***************************************************************************** - * IDirectDraw2 implementation structure - */ -struct IDirectDraw2Impl -{ - /* IUnknown fields */ - ICOM_VFIELD(IDirectDraw2); - DWORD ref; - /* IDirectDraw2 fields */ - struct _common_directdrawdata d; - union { - struct _xlib_directdrawdata xlib; - struct _dga_directdrawdata dga; - } e; -}; - -/***************************************************************************** - * IDirectDraw4 implementation structure - */ -struct IDirectDraw4Impl -{ - /* IUnknown fields */ - ICOM_VFIELD(IDirectDraw4); - DWORD ref; - /* IDirectDraw4 fields */ - struct _common_directdrawdata d; - union { - struct _xlib_directdrawdata xlib; - struct _dga_directdrawdata dga; - } e; -}; - /***************************************************************************** * IDirectDrawSurface implementation structure */ +struct IDirect3DTexture2Impl; struct _common_directdrawsurface { IDirectDrawPaletteImpl* palette; @@ -160,45 +245,27 @@ struct _common_directdrawsurface DDSURFACEDESC surface_desc; /* For Get / Release DC methods */ - HBITMAP DIBsection; - void *bitmap_data; - HDC hdc; - HGDIOBJ holdbitmap; + HBITMAP DIBsection; + void *bitmap_data; + HDC hdc; + HGDIOBJ holdbitmap; + LPDIRECTDRAWCLIPPER lpClipper; /* Callback for loaded textures */ - IDirect3DTexture2Impl* texture; - HRESULT WINAPI (*SetColorKey_cb)(IDirect3DTexture2Impl *texture, DWORD dwFlags, LPDDCOLORKEY ckey ) ; - - /* Storage for attached device (void * as it can be either a Device or a Device2) */ - void *d3d_device; - - LPDIRECTDRAWCLIPPER lpClipper; -}; - -struct _dga_directdrawsurface -{ - DWORD fb_height; -}; - -struct _xlib_directdrawsurface -{ - XImage *image; -#ifdef HAVE_LIBXXSHM - XShmSegmentInfo shminfo; -#endif + struct IDirect3DTexture2Impl* texture; + HRESULT WINAPI (*SetColorKey_cb)(struct IDirect3DTexture2Impl *texture, DWORD dwFlags, LPDDCOLORKEY ckey ) ; }; +extern IDirectDrawSurface4Impl* _common_find_flipto(IDirectDrawSurface4Impl* This,IDirectDrawSurface4Impl* flipto); struct IDirectDrawSurfaceImpl { /* IUnknown fields */ ICOM_VFIELD(IDirectDrawSurface); DWORD ref; + /* IDirectDrawSurface fields */ struct _common_directdrawsurface s; - union { - struct _dga_directdrawsurface dga; - struct _xlib_directdrawsurface xlib; - } t; + LPVOID private; }; /***************************************************************************** @@ -211,10 +278,7 @@ struct IDirectDrawSurface2Impl DWORD ref; /* IDirectDrawSurface2 fields */ struct _common_directdrawsurface s; - union { - struct _dga_directdrawsurface dga; - struct _xlib_directdrawsurface xlib; - } t; + LPVOID private; }; /***************************************************************************** @@ -227,10 +291,7 @@ struct IDirectDrawSurface3Impl DWORD ref; /* IDirectDrawSurface3 fields */ struct _common_directdrawsurface s; - union { - struct _dga_directdrawsurface dga; - struct _xlib_directdrawsurface xlib; - } t; + LPVOID private; }; /***************************************************************************** @@ -244,28 +305,104 @@ struct IDirectDrawSurface4Impl /* IDirectDrawSurface4 fields */ struct _common_directdrawsurface s; - union { - struct _dga_directdrawsurface dga; - struct _xlib_directdrawsurface xlib; - } t; + LPVOID private; } ; struct _surface_chain { IDirectDrawSurface4Impl **surfaces; int nrofsurfaces; }; +extern HRESULT common_off_screen_CreateSurface(IDirectDraw2Impl* This,IDirectDrawSurfaceImpl* lpdsf); +extern HRESULT WINAPI IDirectDrawSurface4Impl_Lock(LPDIRECTDRAWSURFACE4 iface,LPRECT lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE hnd); +extern HRESULT WINAPI IDirectDrawSurface4Impl_Unlock( LPDIRECTDRAWSURFACE4 iface,LPVOID surface); +extern HRESULT WINAPI IDirectDrawSurface4Impl_Blt(LPDIRECTDRAWSURFACE4 iface,LPRECT rdst,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx); +extern HRESULT WINAPI IDirectDrawSurface4Impl_BltFast(LPDIRECTDRAWSURFACE4 iface,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD trans); +extern HRESULT WINAPI IDirectDrawSurface4Impl_BltBatch(LPDIRECTDRAWSURFACE4 iface,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetCaps(LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS caps); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetSurfaceDesc(LPDIRECTDRAWSURFACE4 iface,LPDDSURFACEDESC ddsd); +extern ULONG WINAPI IDirectDrawSurface4Impl_AddRef(LPDIRECTDRAWSURFACE4 iface); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetAttachedSurface(LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE4 *lpdsf); +extern HRESULT WINAPI IDirectDrawSurface4Impl_Initialize(LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetPixelFormat(LPDIRECTDRAWSURFACE4 iface,LPDDPIXELFORMAT pf); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetBltStatus(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetOverlayPosition(LPDIRECTDRAWSURFACE4 iface,LPLONG x1,LPLONG x2); +extern HRESULT WINAPI IDirectDrawSurface4Impl_SetClipper(LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWCLIPPER lpClipper); +extern HRESULT WINAPI IDirectDrawSurface4Impl_AddAttachedSurface(LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 surf); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetDC(LPDIRECTDRAWSURFACE4 iface,HDC* lphdc); +extern HRESULT WINAPI IDirectDrawSurface4Impl_ReleaseDC(LPDIRECTDRAWSURFACE4 iface,HDC hdc); +extern HRESULT WINAPI IDirectDrawSurface4Impl_QueryInterface(LPDIRECTDRAWSURFACE4 iface,REFIID refiid,LPVOID *obj); +extern HRESULT WINAPI IDirectDrawSurface4Impl_IsLost(LPDIRECTDRAWSURFACE4 iface); +extern HRESULT WINAPI IDirectDrawSurface4Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE4 iface,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb); +extern HRESULT WINAPI IDirectDrawSurface4Impl_Restore(LPDIRECTDRAWSURFACE4 iface); +extern HRESULT WINAPI IDirectDrawSurface4Impl_SetColorKey(LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags, LPDDCOLORKEY ckey); +extern HRESULT WINAPI IDirectDrawSurface4Impl_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE4 iface,LPRECT lpRect); +extern HRESULT WINAPI IDirectDrawSurface4Impl_DeleteAttachedSurface(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags,LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface); +extern HRESULT WINAPI IDirectDrawSurface4Impl_EnumOverlayZOrders(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags,LPVOID lpContext,LPDDENUMSURFACESCALLBACK lpfnCallback); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetClipper(LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWCLIPPER* lplpDDClipper); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetColorKey(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags,LPDDCOLORKEY lpDDColorKey); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetFlipStatus(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetPalette(LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE* lplpDDPalette); +extern HRESULT WINAPI IDirectDrawSurface4Impl_SetOverlayPosition(LPDIRECTDRAWSURFACE4 iface,LONG lX,LONG lY); +extern HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlay(LPDIRECTDRAWSURFACE4 iface,LPRECT lpSrcRect,LPDIRECTDRAWSURFACE4 lpDDDestSurface,LPRECT lpDestRect,DWORD dwFlags,LPDDOVERLAYFX lpDDOverlayFx); +extern HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayDisplay(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags); +extern HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayZOrder(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags,LPDIRECTDRAWSURFACE4 lpDDSReference); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetDDInterface(LPDIRECTDRAWSURFACE4 iface,LPVOID* lplpDD); +extern HRESULT WINAPI IDirectDrawSurface4Impl_PageLock(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags); +extern HRESULT WINAPI IDirectDrawSurface4Impl_PageUnlock(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags); +extern HRESULT WINAPI IDirectDrawSurface4Impl_SetSurfaceDesc(LPDIRECTDRAWSURFACE4 iface,LPDDSURFACEDESC lpDDSD,DWORD dwFlags); +extern HRESULT WINAPI IDirectDrawSurface4Impl_SetPrivateData(LPDIRECTDRAWSURFACE4 iface,REFGUID guidTag,LPVOID lpData,DWORD cbSize,DWORD dwFlags); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetPrivateData(LPDIRECTDRAWSURFACE4 iface,REFGUID guidTag,LPVOID lpBuffer,LPDWORD lpcbBufferSize); +extern HRESULT WINAPI IDirectDrawSurface4Impl_FreePrivateData(LPDIRECTDRAWSURFACE4 iface,REFGUID guidTag); +extern HRESULT WINAPI IDirectDrawSurface4Impl_GetUniquenessValue(LPDIRECTDRAWSURFACE4 iface,LPDWORD lpValue); +extern HRESULT WINAPI IDirectDrawSurface4Impl_ChangeUniquenessValue(LPDIRECTDRAWSURFACE4 iface); -/***************************************************************************** - * IDirectDrawColorControl implementation structure +extern void _common_IDirectDrawImpl_SetDisplayMode(IDirectDrawImpl* This); + +/* Get DDSCAPS of surface (shortcutmacro) */ +#define SDDSCAPS(iface) ((iface)->s.surface_desc.ddsCaps.dwCaps) +/* Get the number of bytes per pixel for a given surface */ +#define PFGET_BPP(pf) (pf.dwFlags&DDPF_PALETTEINDEXED8?1:(pf.u.dwRGBBitCount/8)) +#define GET_BPP(desc) PFGET_BPP(desc.ddpfPixelFormat) + +extern int _common_depth_to_pixelformat(DWORD depth, DDPIXELFORMAT *pixelformat,DDPIXELFORMAT *screen_pixelformat, int *pix_depth); + +typedef struct { + unsigned short bpp,depth; + unsigned int rmask,gmask,bmask; +} ConvertMode; + +typedef struct { + void (*pixel_convert)(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette); + void (*palette_convert)(LPPALETTEENTRY palent, void *screen_palette, DWORD start, DWORD count); +} ConvertFuncs; + +typedef struct { + ConvertMode screen, dest; + ConvertFuncs funcs; +} Convert; + +extern Convert ModeEmulations[5]; +extern int _common_depth_to_pixelformat( + DWORD depth,DDPIXELFORMAT *pixelformat, + DDPIXELFORMAT *screen_pixelformat, int *pix_depth +); + +extern HRESULT create_direct3d(LPVOID *obj,IDirectDraw2Impl*); +extern HRESULT create_direct3d2(LPVOID *obj,IDirectDraw2Impl*); + +/****************************************************************************** + * Debugging / Flags output functions */ -struct IDirectDrawColorControlImpl -{ - /* IUnknown fields */ - ICOM_VFIELD(IDirectDrawColorControl); - DWORD ref; - /* IDirectDrawColorControl fields */ - /* none */ -}; - - -#endif /* __GRAPHICS_WINE_DDRAW_PRIVATE_H */ +extern void _dump_DDBLTFX(DWORD flagmask); +extern void _dump_DDBLTFAST(DWORD flagmask); +extern void _dump_DDBLT(DWORD flagmask); +extern void _dump_DDSCAPS(void *in); +extern void _dump_pixelformat_flag(DWORD flagmask); +extern void _dump_paletteformat(DWORD dwFlags); +extern void _dump_pixelformat(void *in); +extern void _dump_colorkeyflag(DWORD ck); +extern void _dump_surface_desc(DDSURFACEDESC *lpddsd); +extern void _dump_cooperativelevel(DWORD cooplevel); +extern void _dump_surface_desc(DDSURFACEDESC *lpddsd); +extern void _dump_DDCOLORKEY(void *in); +#endif /* __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H */ diff --git a/dlls/ddraw/dga.c b/dlls/ddraw/dga.c new file mode 100644 index 00000000000..eb762d35930 --- /dev/null +++ b/dlls/ddraw/dga.c @@ -0,0 +1,273 @@ +/* DirectDraw using DGA + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff) + */ +/* XF86DGA: + * When DirectVideo mode is enabled you can no longer use 'normal' X + * applications nor can you switch to a virtual console. Also, enabling + * only works, if you have switched to the screen where the application + * is running. + * Some ways to debug this stuff are: + * - A terminal connected to the serial port. Can be bought used for cheap. + * (This is the method I am using.) + * - Another machine connected over some kind of network. + */ + +#include "config.h" +#include "winerror.h" + +#include +#include +#ifdef HAVE_SYS_SIGNAL_H +# include +#endif +#include +#include +#include + +#include "gdi.h" +#include "heap.h" +#include "dc.h" +#include "win.h" +#include "wine/exception.h" +#include "ddraw.h" +#include "d3d.h" +#include "debugtools.h" +#include "spy.h" +#include "message.h" +#include "options.h" +#include "monitor.h" + +#include "dga_private.h" + +#define RESTORE__SIGNALS + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#ifdef HAVE_LIBXXF86VM +XF86VidModeModeInfo *orig_mode = NULL; +#endif + +static inline BOOL get_option( const char *name, BOOL def ) { + return PROFILE_GetWineIniBool( "x11drv", name, def ); +} + +static BYTE +DDRAW_DGA_Available(void) +{ + int fd, evbase, evret, majver, minver; + static BYTE return_value = 0xFF; + + /* This prevents from probing X times for DGA */ + if (return_value != 0xFF) + return return_value; + + if (!get_option( "UseDGA", 1 )) { + TRACE("UseDGA disabled.\n"); + return_value = 0; + return 0; + } + + /* First, query the extenstion and its version */ + if (!TSXF86DGAQueryExtension(display,&evbase,&evret)) { + TRACE("DGA extension not detected.\n"); + return_value = 0; + return 0; + } + + if (!TSXF86DGAQueryVersion(display,&majver,&minver)) { + TRACE("DGA version not detected.\n"); + return_value = 0; + return 0; + } + +#ifdef HAVE_LIBXXF86DGA2 + if (majver >= 2) { + /* We have DGA 2.0 available ! */ + if (TSXDGAOpenFramebuffer(display, DefaultScreen(display))) { + TSXDGACloseFramebuffer(display, DefaultScreen(display)); + return_value = 2; + } else + return_value = 0; + return return_value; + } +#endif /* defined(HAVE_LIBXXF86DGA2) */ + + /* You don't have to be root to use DGA extensions. Simply having access + * to /dev/mem will do the trick + * This can be achieved by adding the user to the "kmem" group on + * Debian 2.x systems, don't know about + * others. --stephenc + */ + if ((fd = open("/dev/mem", O_RDWR)) != -1) + close(fd); + + if (fd != -1) + return_value = 1; + else { + TRACE("You have no access to /dev/mem\n"); + return_value = 0; + } + return return_value; +} + +HRESULT +DGA_Create( LPDIRECTDRAW *lplpDD ) { + IDirectDrawImpl* ddraw; + dga_dd_private* dgpriv; + int memsize,banksize,major,minor,flags; + char *addr; + int depth; + int dga_version; + int width, height; + + /* Get DGA availability / version */ + dga_version = DDRAW_DGA_Available(); + if (dga_version == 0) + return DDERR_GENERIC; + + /* If we were just testing ... return OK */ + if (lplpDD == NULL) + return DD_OK; + + ddraw = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawImpl)); + *lplpDD = (LPDIRECTDRAW)ddraw; + ddraw->ref = 1; + ICOM_VTBL(ddraw) = &dga_ddvt; + + ddraw->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(dga_dd_private)); + + dgpriv = (dga_dd_private*)ddraw->private; +#ifdef HAVE_LIBXXF86DGA2 + if (dga_version == 1) { + dgpriv->version = 1; +#endif /* defined(HAVE_LIBXXF86DGA2) */ + TSXF86DGAQueryVersion(display,&major,&minor); + TRACE("XF86DGA is version %d.%d\n",major,minor); + + TSXF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags); + if (!(flags & XF86DGADirectPresent)) + MESSAGE("direct video is NOT PRESENT.\n"); + TSXF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize); + dgpriv->fb_width = width; + TSXF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height); + TSXF86DGASetViewPort(display,DefaultScreen(display),0,0); + dgpriv->fb_height = height; + TRACE("video framebuffer: begin %p, width %d,banksize %d,memsize %d\n", + addr,width,banksize,memsize + ); + TRACE("viewport height: %d\n",height); + /* Get the screen dimensions as seen by Wine. + * In that case, it may be better to ignore the -desktop mode and + * return the real screen size => print a warning + */ + ddraw->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); + ddraw->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); + if ((ddraw->d.height != height) || (ddraw->d.width != width)) + WARN("You seem to be running in -desktop mode. This may prove dangerous in DGA mode...\n"); + dgpriv->fb_addr = addr; + dgpriv->fb_memsize = memsize; + dgpriv->vpmask = 0; + + /* just assume the default depth is the DGA depth too */ + depth = DefaultDepthOfScreen(X11DRV_GetXScreen()); + + _common_depth_to_pixelformat(depth, &(ddraw->d.directdraw_pixelformat), &(ddraw->d.screen_pixelformat), NULL); + +#ifdef RESTORE_SIGNALS + SIGNAL_Init(); +#endif +#ifdef HAVE_LIBXXF86DGA2 + } else { + XDGAMode *modes; + int i, num_modes; + int mode_to_use = 0; + + dgpriv->version = 2; + + TSXDGAQueryVersion(display,&major,&minor); + TRACE("XDGA is version %d.%d\n",major,minor); + + TRACE("Opening the frame buffer.\n"); + if (!TSXDGAOpenFramebuffer(display, DefaultScreen(display))) { + ERR("Error opening the frame buffer !!!\n"); + return DDERR_GENERIC; + } + + /* List all available modes */ + modes = TSXDGAQueryModes(display, DefaultScreen(display), &num_modes); + dgpriv->modes = modes; + dgpriv->num_modes = num_modes; + + TRACE("Available modes :\n"); + for (i = 0; i < num_modes; i++) { + if (TRACE_ON(ddraw)) { + DPRINTF(" %d) - %s (FB: %dx%d / VP: %dx%d) - depth %d -", + modes[i].num, + modes[i].name, modes[i].imageWidth, modes[i].imageHeight, + modes[i].viewportWidth, modes[i].viewportHeight, + modes[i].depth + ); +#define XX(x) if (modes[i].flags & x) DPRINTF(" "#x" "); + XX(XDGAConcurrentAccess); + XX(XDGASolidFillRect); + XX(XDGABlitRect); + XX(XDGABlitTransRect); + XX(XDGAPixmap); +#undef XX + DPRINTF("\n"); + } + if ((MONITOR_GetHeight(&MONITOR_PrimaryMonitor) == modes[i].viewportHeight) && + (MONITOR_GetWidth(&MONITOR_PrimaryMonitor) == modes[i].viewportWidth) && + (MONITOR_GetDepth(&MONITOR_PrimaryMonitor) == modes[i].depth) + ) { + mode_to_use = modes[i].num; + } + } + } + if (mode_to_use == 0) { + ERR("Could not find mode !\n"); + mode_to_use = 1; + } else { + DPRINTF("Using mode number %d\n", mode_to_use); + } + + /* Initialize the frame buffer */ + _DGA_Initialize_FrameBuffer(*ilplpDD, mode_to_use); + /* Set the input handling for relative mouse movements */ + X11DRV_EVENT_SetInputMehod(X11DRV_INPUT_RELATIVE); + } +#endif /* defined(HAVE_LIBXXF86DGA2) */ + return DD_OK; +} + +/* Where do these GUIDs come from? mkuuid. + * They exist solely to distinguish between the targets Wine support, + * and should be different than any other GUIDs in existence. + */ +static GUID DGA_DirectDraw_GUID = { /* e2dcb020-dc60-11d1-8407-9714f5d50802 */ + 0xe2dcb020, + 0xdc60, + 0x11d1, + {0x84, 0x07, 0x97, 0x14, 0xf5, 0xd5, 0x08, 0x02} +}; + +ddraw_driver dga_driver = { + &DGA_DirectDraw_GUID, + "display", + "WINE XF86DGA DirectDraw Driver", + 100, + DGA_Create +}; + +#ifdef __GNUC__ +static void DGA_register(void) __attribute__((constructor)); +#else /* defined(__GNUC__) */ +static void __asm__dummy_dll_init(void) { + asm("\t.section .init ,\"ax\"\n" + "\tcall DGA_register\n" + "\t.previous\n"); +} +#endif /* defined(__GNUC__) */ +static void DGA_register(void) { ddraw_register_driver(&dga_driver); } diff --git a/dlls/ddraw/dga_private.h b/dlls/ddraw/dga_private.h new file mode 100644 index 00000000000..30c9a3160c9 --- /dev/null +++ b/dlls/ddraw/dga_private.h @@ -0,0 +1,40 @@ +#ifndef __WINE_DDRAW_DGA_PRIVATE_H +#define __WINE_DDRAW_DGA_PRIVATE_H + +#include "ddraw_private.h" +#include "x11_private.h" + +#include "ts_xf86dga.h" +#ifdef HAVE_LIBXXF86DGA2 +# include "ts_xf86dga2.h" +#endif /* defined(HAVE_LIBXXF86DGA2) */ + +#ifdef HAVE_LIBXXF86VM +# include "ts_xf86vmode.h" +extern XF86VidModeModeInfo *orig_mode; +#endif /* defined(HAVE_LIBXXF86VM) */ + +extern ICOM_VTABLE(IDirectDrawSurface4) dga_dds4vt; +#ifdef HAVE_LIBXXF86DGA2 +extern ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt; +#endif /* defined(HAVE_LIBXXF86DGA2) */ + +extern ICOM_VTABLE(IDirectDraw) dga_ddvt; +extern ICOM_VTABLE(IDirectDrawPalette) dga_ddpalvt; + +typedef struct dga_dd_private { + DWORD fb_height; /* height of the viewport */ + DWORD fb_width; /* width of the viewport */ + caddr_t fb_addr; /* start address of the framebuffer */ + DWORD fb_memsize; /* total memory on the card */ + DWORD vpmask; /* viewports in use flag bitmap */ + DWORD version; /* DGA version */ +} dga_dd_private; + +typedef x11_dp_private dga_dp_private; /* reuse X11 palette stuff */ + +typedef struct dga_ds_private { + DWORD fb_height; +} dga_ds_private; + +#endif /* __WINE_DDRAW_DGA_PRIVATE_H */ diff --git a/dlls/ddraw/direct3d/main.c b/dlls/ddraw/direct3d/main.c new file mode 100644 index 00000000000..7086ed02d41 --- /dev/null +++ b/dlls/ddraw/direct3d/main.c @@ -0,0 +1,280 @@ +#include "config.h" + +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "ddraw.h" +#include "d3d.h" +#include "message.h" +#include "options.h" +#include "monitor.h" +#include "debugtools.h" + +#include "d3d_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +static ICOM_VTABLE(IDirect3D) d3dvt; +static ICOM_VTABLE(IDirect3D2) d3d2vt; + +/******************************************************************************* + * IDirect3D + */ +HRESULT WINAPI IDirect3DImpl_QueryInterface( + LPDIRECT3D iface,REFIID refiid,LPVOID *obj +) { + ICOM_THIS(IDirect3DImpl,iface); + /* FIXME: Not sure if this is correct */ + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + if (( IsEqualGUID( &IID_IDirectDraw, refiid ) ) || + ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) || + ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) + ) { + *obj = This->ddraw; + IDirect3D_AddRef(iface); + TRACE(" Creating IDirectDrawX interface (%p)\n", *obj); + return S_OK; + } + if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) || + ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) { + *obj = This; + IDirect3D_AddRef(iface); + TRACE(" Creating IDirect3D interface (%p)\n", *obj); + return S_OK; + } + if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) { + IDirect3D2Impl* d3d; + + d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); + d3d->ref = 1; + d3d->ddraw = This->ddraw; + IDirect3D_AddRef(iface); + ICOM_VTBL(d3d) = &d3d2vt; + *obj = d3d; + TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); + return S_OK; + } + FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface) { + ICOM_THIS(IDirect3DImpl,iface); + TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); + + return ++(This->ref); +} + +ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface) +{ + ICOM_THIS(IDirect3DImpl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + IDirectDraw2_Release((IDirectDraw2*)This->ddraw); + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +HRESULT WINAPI IDirect3DImpl_Initialize(LPDIRECT3D iface,REFIID refiid) { + ICOM_THIS(IDirect3DImpl,iface); + /* FIXME: Not sure if this is correct */ + FIXME("(%p)->(%s):stub.\n",This,debugstr_guid(refiid)); + return DDERR_ALREADYINITIALIZED; +} + +HRESULT WINAPI IDirect3DImpl_EnumDevices( + LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context +) { + ICOM_THIS(IDirect3DImpl,iface); + FIXME("(%p)->(%p,%p),stub!\n",This,cb,context); + return DD_OK; +} + +HRESULT WINAPI IDirect3DImpl_CreateLight( + LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk +) { + ICOM_THIS(IDirect3DImpl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk); + return E_FAIL; +} + +HRESULT WINAPI IDirect3DImpl_CreateMaterial( + LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk +) { + ICOM_THIS(IDirect3DImpl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk); + return E_FAIL; +} + +HRESULT WINAPI IDirect3DImpl_CreateViewport( + LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk +) { + ICOM_THIS(IDirect3DImpl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk); + + return E_FAIL; +} + +HRESULT WINAPI IDirect3DImpl_FindDevice( + LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc, + LPD3DFINDDEVICERESULT lpfinddevrst) +{ + ICOM_THIS(IDirect3DImpl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst); + return DD_OK; +} + +/* This is for checking the correctness of the prototypes/functions. + * Do not remove. + */ +static WINE_UNUSED ICOM_VTABLE(IDirect3D) d3dvt = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirect3DImpl_QueryInterface, + IDirect3DImpl_AddRef, + IDirect3DImpl_Release, + IDirect3DImpl_Initialize, + IDirect3DImpl_EnumDevices, + IDirect3DImpl_CreateLight, + IDirect3DImpl_CreateMaterial, + IDirect3DImpl_CreateViewport, + IDirect3DImpl_FindDevice +}; + +/******************************************************************************* + * IDirect3D2 + */ +HRESULT WINAPI IDirect3D2Impl_QueryInterface( + LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) { + ICOM_THIS(IDirect3D2Impl,iface); + + /* FIXME: Not sure if this is correct */ + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + if ( ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) || + ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) || + ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) { + *obj = This->ddraw; + IDirect3D2_AddRef(iface); + + TRACE(" Creating IDirectDrawX interface (%p)\n", *obj); + + return S_OK; + } + if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) || + ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) { + *obj = This; + IDirect3D2_AddRef(iface); + + TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) { + IDirect3DImpl* d3d; + + d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); + d3d->ref = 1; + d3d->ddraw = This->ddraw; + IDirect3D2_AddRef(iface); + ICOM_VTBL(d3d) = &d3dvt; + *obj = d3d; + TRACE(" Creating IDirect3D interface (%p)\n", *obj); + return S_OK; + } + FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) { + ICOM_THIS(IDirect3D2Impl,iface); + TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); + + return ++(This->ref); +} + +ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface) { + ICOM_THIS(IDirect3D2Impl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + IDirectDraw2_Release((IDirectDraw2*)This->ddraw); + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +HRESULT WINAPI IDirect3D2Impl_EnumDevices( + LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context +) { + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%p,%p),stub!\n",This,cb,context); + return DD_OK; +} + +HRESULT WINAPI IDirect3D2Impl_CreateLight( + LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk +) { + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk); + return E_FAIL; +} + +HRESULT WINAPI IDirect3D2Impl_CreateMaterial( + LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk +) { + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk); + return E_FAIL; +} + +HRESULT WINAPI IDirect3D2Impl_CreateViewport( + LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk +) { + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk); + return E_FAIL; +} + +HRESULT WINAPI IDirect3D2Impl_FindDevice( + LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc, + LPD3DFINDDEVICERESULT lpfinddevrst) +{ + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst); + return DD_OK; +} + +HRESULT WINAPI IDirect3D2Impl_CreateDevice( + LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface, + LPDIRECT3DDEVICE2 *device) +{ + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device); + return DDERR_INVALIDPARAMS; +} + +/* This is for checking the correctness of the prototypes/functions. + * Do not remove. + */ +static WINE_UNUSED ICOM_VTABLE(IDirect3D2) d3d2vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirect3D2Impl_QueryInterface, + IDirect3D2Impl_AddRef, + IDirect3D2Impl_Release, + IDirect3D2Impl_EnumDevices, + IDirect3D2Impl_CreateLight, + IDirect3D2Impl_CreateMaterial, + IDirect3D2Impl_CreateViewport, + IDirect3D2Impl_FindDevice, + IDirect3D2Impl_CreateDevice +}; diff --git a/dlls/ddraw/direct3d/mesa.c b/dlls/ddraw/direct3d/mesa.c new file mode 100644 index 00000000000..8d81e6c5c08 --- /dev/null +++ b/dlls/ddraw/direct3d/mesa.c @@ -0,0 +1,317 @@ +#include "config.h" + +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "ddraw.h" +#include "d3d.h" +#include "message.h" +#include "options.h" +#include "monitor.h" +#include "debugtools.h" + +#include "mesa_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +/******************************************************************************* + * IDirect3D + */ +static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface( + LPDIRECT3D iface,REFIID refiid,LPVOID *obj +) { + ICOM_THIS(IDirect3DImpl,iface); + /* FIXME: Not sure if this is correct */ + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + if (( IsEqualGUID( &IID_IDirectDraw, refiid ) ) || + ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) || + ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) + ) { + *obj = This->ddraw; + IDirect3D_AddRef(iface); + TRACE(" Creating IDirectDrawX interface (%p)\n", *obj); + return S_OK; + } + if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) || + ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) { + *obj = This; + IDirect3D_AddRef(iface); + TRACE(" Creating IDirect3D interface (%p)\n", *obj); + return S_OK; + } + if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) { + IDirect3D2Impl* d3d; + + d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); + d3d->ref = 1; + d3d->ddraw = This->ddraw; + IDirect3D_AddRef(iface); + ICOM_VTBL(d3d) = &mesa_d3d2vt; + *obj = d3d; + TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); + return S_OK; + } + FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface) +{ + ICOM_THIS(IDirect3DImpl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + IDirectDraw2_Release((IDirectDraw2*)This->ddraw); + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices( + LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context +) { + ICOM_THIS(IDirect3DImpl,iface); + FIXME("(%p)->(%p,%p),stub!\n",This,cb,context); + + /* Call functions defined in d3ddevices.c */ + if (!d3d_OpenGL_dx3(cb, context)) + return DD_OK; + + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight( + LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk +) { + ICOM_THIS(IDirect3DImpl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk); + + /* Call the creation function that is located in d3dlight.c */ + *lplight = d3dlight_create_dx3(This); + + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial( + LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk +) { + ICOM_THIS(IDirect3DImpl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk); + /* Call the creation function that is located in d3dviewport.c */ + *lpmaterial = d3dmaterial_create(This); + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport( + LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk +) { + ICOM_THIS(IDirect3DImpl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk); + + /* Call the creation function that is located in d3dviewport.c */ + *lpviewport = d3dviewport_create(This); + + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3DImpl_FindDevice( + LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc, + LPD3DFINDDEVICERESULT lpfinddevrst) +{ + ICOM_THIS(IDirect3DImpl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst); + + return DD_OK; +} + +ICOM_VTABLE(IDirect3D) mesa_d3dvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + MESA_IDirect3DImpl_QueryInterface, + IDirect3DImpl_AddRef, + MESA_IDirect3DImpl_Release, + IDirect3DImpl_Initialize, + MESA_IDirect3DImpl_EnumDevices, + MESA_IDirect3DImpl_CreateLight, + MESA_IDirect3DImpl_CreateMaterial, + MESA_IDirect3DImpl_CreateViewport, + MESA_IDirect3DImpl_FindDevice +}; + +/******************************************************************************* + * IDirect3D2 + */ +static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface( + LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) { + ICOM_THIS(IDirect3D2Impl,iface); + + /* FIXME: Not sure if this is correct */ + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + if ( ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) || + ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) || + ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) { + *obj = This->ddraw; + IDirect3D2_AddRef(iface); + + TRACE(" Creating IDirectDrawX interface (%p)\n", *obj); + + return S_OK; + } + if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) || + ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) { + *obj = This; + IDirect3D2_AddRef(iface); + + TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); + + return S_OK; + } + if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) { + IDirect3DImpl* d3d; + + d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); + d3d->ref = 1; + d3d->ddraw = This->ddraw; + IDirect3D2_AddRef(iface); + ICOM_VTBL(d3d) = &mesa_d3dvt; + *obj = d3d; + TRACE(" Creating IDirect3D interface (%p)\n", *obj); + return S_OK; + } + FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) { + ICOM_THIS(IDirect3D2Impl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (!--(This->ref)) { + IDirectDraw2_Release((IDirectDraw2*)This->ddraw); + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices( + LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context +) { + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%p,%p),stub!\n",This,cb,context); + + /* Call functions defined in d3ddevices.c */ + if (!d3d_OpenGL(cb, context)) + return DD_OK; + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight( + LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk +) { + ICOM_THIS(IDirect3D2Impl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk); + + /* Call the creation function that is located in d3dlight.c */ + *lplight = d3dlight_create(This); + + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial( + LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk +) { + ICOM_THIS(IDirect3D2Impl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk); + + /* Call the creation function that is located in d3dviewport.c */ + *lpmaterial = d3dmaterial2_create(This); + + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport( + LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk +) { + ICOM_THIS(IDirect3D2Impl,iface); + TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk); + + /* Call the creation function that is located in d3dviewport.c */ + *lpviewport = d3dviewport2_create(This); + + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3D2Impl_FindDevice( + LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc, + LPD3DFINDDEVICERESULT lpfinddevrst) +{ + ICOM_THIS(IDirect3D2Impl,iface); + FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst); + return DD_OK; +} + +static HRESULT WINAPI MESA_IDirect3D2Impl_CreateDevice( + LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface, + LPDIRECT3DDEVICE2 *device) +{ + ICOM_THIS(IDirect3D2Impl,iface); + + FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device); + + if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) { + IDirect3D2_AddRef(iface); + return DD_OK; + } + + return DDERR_INVALIDPARAMS; +} + +ICOM_VTABLE(IDirect3D2) mesa_d3d2vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + MESA_IDirect3D2Impl_QueryInterface, + IDirect3D2Impl_AddRef, + MESA_IDirect3D2Impl_Release, + MESA_IDirect3D2Impl_EnumDevices, + MESA_IDirect3D2Impl_CreateLight, + MESA_IDirect3D2Impl_CreateMaterial, + MESA_IDirect3D2Impl_CreateViewport, + MESA_IDirect3D2Impl_FindDevice, + MESA_IDirect3D2Impl_CreateDevice +}; + +HRESULT create_direct3d(LPVOID *obj,IDirectDraw2Impl* ddraw) { + IDirect3DImpl* d3d; + + d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); + d3d->ref = 1; + d3d->ddraw = ddraw; + d3d->private = NULL; /* unused for now */ + IDirectDraw_AddRef((LPDIRECTDRAW)ddraw); + ICOM_VTBL(d3d) = &mesa_d3dvt; + *obj = (LPUNKNOWN)d3d; + TRACE(" Created IDirect3D interface (%p)\n", *obj); + return S_OK; +} + +HRESULT create_direct3d2(LPVOID *obj,IDirectDraw2Impl* ddraw) { + IDirect3D2Impl* d3d; + + d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d)); + d3d->ref = 1; + d3d->ddraw = ddraw; + d3d->private = NULL; /* unused for now */ + IDirectDraw_AddRef((LPDIRECTDRAW)ddraw); + ICOM_VTBL(d3d) = &mesa_d3d2vt; + *obj = (LPUNKNOWN)d3d; + TRACE(" Creating IDirect3D2 interface (%p)\n", *obj); + return S_OK; +} diff --git a/dlls/ddraw/dpalette/dga.c b/dlls/ddraw/dpalette/dga.c new file mode 100644 index 00000000000..94a35b64c5e --- /dev/null +++ b/dlls/ddraw/dpalette/dga.c @@ -0,0 +1,76 @@ +/* DirectDrawPalette XF86DGA implementation + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998 Lionel Ulmer (most of Direct3D stuff) + */ + +#include "config.h" +#include "winerror.h" + +#include +#include +#include +#include + +#include "debugtools.h" + +#include "dga_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#define DPPRIVATE(x) dga_dp_private *dppriv = ((dga_dp_private*)(x)->private) +#define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->private) + +HRESULT WINAPI DGA_IDirectDrawPaletteImpl_SetEntries( + LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent +) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + DPPRIVATE(This); + XColor xc; + Colormap cm; + int i; + + TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",This,x,start,count,palent); + if (!dppriv->cm) /* should not happen */ { + FIXME("app tried to set colormap in non-palettized mode\n"); + return DDERR_GENERIC; + } + /* FIXME: free colorcells instead of freeing whole map */ + cm = dppriv->cm; + dppriv->cm = TSXCopyColormapAndFree(display,dppriv->cm); + TSXFreeColormap(display,cm); + + for (i=0;icm,&xc); + + This->palents[start+i].peRed = palent[i].peRed; + This->palents[start+i].peBlue = palent[i].peBlue; + This->palents[start+i].peGreen = palent[i].peGreen; + This->palents[start+i].peFlags = palent[i].peFlags; + } +#ifdef HAVE_LIBXXF86DGA2 + if (ddpriv->version == 2) { + DDPRIVATE(This->ddraw); + TSXDGAInstallColormap(display,DefaultScreen(display),dppriv->cm); + } else +#endif /* defined(HAVE_LIBXXF86DGA2) */ + TSXF86DGAInstallColormap(display,DefaultScreen(display),dppriv->cm); + return DD_OK; +} +ICOM_VTABLE(IDirectDrawPalette) dga_ddpalvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectDrawPaletteImpl_QueryInterface, + IDirectDrawPaletteImpl_AddRef, + Xlib_IDirectDrawPaletteImpl_Release, + IDirectDrawPaletteImpl_GetCaps, + IDirectDrawPaletteImpl_GetEntries, + IDirectDrawPaletteImpl_Initialize, + DGA_IDirectDrawPaletteImpl_SetEntries +}; diff --git a/dlls/ddraw/dpalette/main.c b/dlls/ddraw/dpalette/main.c new file mode 100644 index 00000000000..c7ce5dc1e25 --- /dev/null +++ b/dlls/ddraw/dpalette/main.c @@ -0,0 +1,110 @@ +/* DirectDraw - IDirectPalette base interface + * + * Copyright 1997-2000 Marcus Meissner + */ + +#include "config.h" +#include "winerror.h" + +#include +#include +#include +#include + +#include "ddraw_private.h" +#include "debugtools.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +/****************************************************************************** + * IDirectDrawPalette + */ +HRESULT WINAPI IDirectDrawPaletteImpl_GetEntries( + LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent +) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + int i; + + TRACE("(%p)->GetEntries(%08lx,%ld,%ld,%p)\n",This,x,start,count,palent); + + for (i=0;ipalents[start+i].peRed; + palent[i].peBlue = This->palents[start+i].peBlue; + palent[i].peGreen = This->palents[start+i].peGreen; + palent[i].peFlags = This->palents[start+i].peFlags; + } + return DD_OK; +} + +HRESULT WINAPI IDirectDrawPaletteImpl_SetEntries( + LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent +) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + int i; + + TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n", This,x,start,count,palent); + for (i=0;ipalents[start+i].peRed = palent[i].peRed; + This->palents[start+i].peBlue = palent[i].peBlue; + This->palents[start+i].peGreen = palent[i].peGreen; + This->palents[start+i].peFlags = palent[i].peFlags; + } + + /* Now, if we are in 'depth conversion mode', update the screen palette */ + /* FIXME: we need to update the image or we won't get palette fading. */ + if (This->ddraw->d.palette_convert != NULL) + This->ddraw->d.palette_convert(palent,This->screen_palents,start,count); + return DD_OK; +} + +ULONG WINAPI IDirectDrawPaletteImpl_Release(LPDIRECTDRAWPALETTE iface) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + if (!--(This->ref)) { + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +ULONG WINAPI IDirectDrawPaletteImpl_AddRef(LPDIRECTDRAWPALETTE iface) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); + return ++(This->ref); +} + +HRESULT WINAPI IDirectDrawPaletteImpl_Initialize( + LPDIRECTDRAWPALETTE iface,LPDIRECTDRAW ddraw,DWORD x,LPPALETTEENTRY palent +) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + TRACE("(%p)->(%p,%ld,%p)\n", This, ddraw, x, palent); + return DDERR_ALREADYINITIALIZED; +} + +HRESULT WINAPI IDirectDrawPaletteImpl_GetCaps( + LPDIRECTDRAWPALETTE iface, LPDWORD lpdwCaps ) +{ + ICOM_THIS(IDirectDrawPaletteImpl,iface); + FIXME("(%p)->(%p) stub.\n", This, lpdwCaps ); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawPaletteImpl_QueryInterface( + LPDIRECTDRAWPALETTE iface,REFIID refiid,LPVOID *obj ) +{ + ICOM_THIS(IDirectDrawPaletteImpl,iface); + FIXME("(%p)->(%s,%p) stub.\n",This,debugstr_guid(refiid),obj); + return S_OK; +} + +ICOM_VTABLE(IDirectDrawPalette) ddraw_ddpalvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectDrawPaletteImpl_QueryInterface, + IDirectDrawPaletteImpl_AddRef, + IDirectDrawPaletteImpl_Release, + IDirectDrawPaletteImpl_GetCaps, + IDirectDrawPaletteImpl_GetEntries, + IDirectDrawPaletteImpl_Initialize, + IDirectDrawPaletteImpl_SetEntries +}; diff --git a/dlls/ddraw/dpalette/x11.c b/dlls/ddraw/dpalette/x11.c new file mode 100644 index 00000000000..704518da9d2 --- /dev/null +++ b/dlls/ddraw/dpalette/x11.c @@ -0,0 +1,85 @@ +/* DirectDraw IDirectDrawPalette X11 implementation + * + * Copyright 1997-2000 Marcus Meissner + */ + +#include "config.h" +#include "winerror.h" + + +#include +#include +#include +#include + +#include "debugtools.h" + +#include "x11_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#define DPPRIVATE(x) x11_dp_private *dppriv = ((x11_dp_private*)x->private) + +/****************************************************************************** + * IDirectDrawPalette + */ + +HRESULT WINAPI Xlib_IDirectDrawPaletteImpl_SetEntries( + LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent +) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + XColor xc; + int i; + DPPRIVATE(This); + + TRACE("(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",This,x,start,count,palent); + for (i=0;icm) + TSXStoreColor(display,dppriv->cm,&xc); + + This->palents[start+i].peRed = palent[i].peRed; + This->palents[start+i].peBlue = palent[i].peBlue; + This->palents[start+i].peGreen = palent[i].peGreen; + This->palents[start+i].peFlags = palent[i].peFlags; + } + + /* Now, if we are in 'depth conversion mode', update the screen palette */ + /* FIXME: we need to update the image or we won't get palette fading. */ + if (This->ddraw->d.palette_convert != NULL) { + This->ddraw->d.palette_convert(palent,This->screen_palents,start,count); + } + return DD_OK; +} + +ULONG WINAPI Xlib_IDirectDrawPaletteImpl_Release(LPDIRECTDRAWPALETTE iface) { + ICOM_THIS(IDirectDrawPaletteImpl,iface); + DPPRIVATE(This); + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + if (!--(This->ref)) { + if (dppriv->cm) { + TSXFreeColormap(display,dppriv->cm); + dppriv->cm = 0; + } + HeapFree(GetProcessHeap(),0,This); + return S_OK; + } + return This->ref; +} + +ICOM_VTABLE(IDirectDrawPalette) xlib_ddpalvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectDrawPaletteImpl_QueryInterface, + IDirectDrawPaletteImpl_AddRef, + Xlib_IDirectDrawPaletteImpl_Release, + IDirectDrawPaletteImpl_GetCaps, + IDirectDrawPaletteImpl_GetEntries, + IDirectDrawPaletteImpl_Initialize, + Xlib_IDirectDrawPaletteImpl_SetEntries +}; diff --git a/dlls/ddraw/dsurface/dga.c b/dlls/ddraw/dsurface/dga.c new file mode 100644 index 00000000000..2222f826b30 --- /dev/null +++ b/dlls/ddraw/dsurface/dga.c @@ -0,0 +1,270 @@ +/* DirectDrawSurface XF86DGA implementation + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff) + */ +#include "config.h" +#include "winerror.h" + +#include +#include +#include +#include +#include +#include + +#include "debugtools.h" +#include "dga_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#define DDPRIVATE(x) dga_dd_private *ddpriv = ((dga_dd_private*)(x)->private) +#define DPPRIVATE(x) dga_dp_private *dppriv = ((dga_dp_private*)(x)->private) +#define DSPRIVATE(x) dga_ds_private *dspriv = ((dga_ds_private*)(x)->private) + +/****************************************************************************** + * IDirectDrawSurface methods + * + * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let + * DDS and DDS2 use those functions. (Function calls did not change (except + * using different DirectDrawSurfaceX version), just added flags and functions) + */ + +HRESULT WINAPI DGA_IDirectDrawSurface4Impl_Flip( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + DSPRIVATE(This); + dga_ds_private *fspriv; + IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto; + DWORD xheight; + LPBYTE surf; + + TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags); + iflipto = _common_find_flipto(This,iflipto); + + /* and flip! */ + fspriv = (dga_ds_private*)iflipto->private; + TSXF86DGASetViewPort(display,DefaultScreen(display),0,fspriv->fb_height); + if (iflipto->s.palette) { + DPPRIVATE(iflipto); + + if (dppriv->cm) + TSXF86DGAInstallColormap(display,DefaultScreen(display),dppriv->cm); + } + while (!TSXF86DGAViewPortChanged(display,DefaultScreen(display),2)) { + /* EMPTY */ + } + /* We need to switch the lowlevel surfaces, for DGA this is: */ + + /* The height within the framebuffer */ + xheight = dspriv->fb_height; + dspriv->fb_height = fspriv->fb_height; + fspriv->fb_height = xheight; + + /* And the assciated surface pointer */ + surf = This->s.surface_desc.u1.lpSurface; + This->s.surface_desc.u1.lpSurface = iflipto->s.surface_desc.u1.lpSurface; + iflipto->s.surface_desc.u1.lpSurface= surf; + return DD_OK; +} + +#ifdef HAVE_LIBXXF86DGA2 +HRESULT WINAPI DGA2_IDirectDrawSurface4Impl_Flip( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto; + DWORD xheight; + dga_ds_private *fspriv; + LPBYTE surf; + + TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags); + iflipto = _common_find_flipto(This,iflipto); + + /* and flip! */ + fspriv = (dga_ds_private*)iflipto->private; + TSXDGASetViewport(display,DefaultScreen(display),0,fspriv->fb_height, XDGAFlipRetrace); + TSXDGASync(display,DefaultScreen(display)); + TSXFlush(display); + if (iflipto->s.palette) { + DPPRIVATE(iflipto->s.palette); + if (dppriv->cm) + TSXDGAInstallColormap(display,DefaultScreen(display),dppriv->cm); + } + + /* We need to switch the lowlevel surfaces, for DGA this is: */ + /* The height within the framebuffer */ + xheight = dspriv->fb_height; + dspriv->fb_height = fspriv->fb_height; + fspriv->fb_height = xheight; + + /* And the assciated surface pointer */ + surf = This->s.surface_desc.u1.lpSurface; + This->s.surface_desc.u1.lpSurface = iflipto->s.surface_desc.u1.lpSurface; + iflipto->s.surface_desc.u1.lpSurface = surf; + + return DD_OK; +} +#endif /* defined(HAVE_LIBXXF86DGA2) */ + +HRESULT WINAPI DGA_IDirectDrawSurface4Impl_SetPalette( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal; + + TRACE("(%p)->(%p)\n",This,ipal); + + /* According to spec, we are only supposed to + * AddRef if this is not the same palette. + */ + if( This->s.palette != ipal ) { + dga_dp_private *fppriv; + if( ipal != NULL ) + IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal ); + if( This->s.palette != NULL ) + IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette ); + This->s.palette = ipal; + fppriv = (dga_dp_private*)This->s.palette->private; +#ifdef HAVE_LIBXXF86DGA2 + if (ddpriv->version == 2) + TSXDGAInstallColormap(display,DefaultScreen(display),fppriv->cm); + else +#endif /* defined(HAVE_LIBXXF86DGA2) */ + TSXF86DGAInstallColormap(display,DefaultScreen(display),fppriv->cm); + } + return DD_OK; +} + +ULONG WINAPI DGA_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + DDPRIVATE(This->s.ddraw); + DSPRIVATE(This); + + TRACE("(%p)->() decrementing from %lu.\n", This, This->ref ); + + if (--(This->ref)) + return This->ref; + + IDirectDraw2_Release((IDirectDraw2*)This->s.ddraw); + /* clear out of surface list */ + if (ddpriv->fb_height == -1) + HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); + else + ddpriv->vpmask &= ~(1<<(dspriv->fb_height/ddpriv->fb_height)); + + /* Free the DIBSection (if any) */ + if (This->s.hdc != 0) { + SelectObject(This->s.hdc, This->s.holdbitmap); + DeleteDC(This->s.hdc); + DeleteObject(This->s.DIBsection); + } + /* Free the clipper if attached to this surface */ + if( This->s.lpClipper ) + IDirectDrawClipper_Release(This->s.lpClipper); + HeapFree(GetProcessHeap(),0,This); + return S_OK; +} + +ICOM_VTABLE(IDirectDrawSurface4) dga_dds4vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectDrawSurface4Impl_QueryInterface, + IDirectDrawSurface4Impl_AddRef, + DGA_IDirectDrawSurface4Impl_Release, + IDirectDrawSurface4Impl_AddAttachedSurface, + IDirectDrawSurface4Impl_AddOverlayDirtyRect, + IDirectDrawSurface4Impl_Blt, + IDirectDrawSurface4Impl_BltBatch, + IDirectDrawSurface4Impl_BltFast, + IDirectDrawSurface4Impl_DeleteAttachedSurface, + IDirectDrawSurface4Impl_EnumAttachedSurfaces, + IDirectDrawSurface4Impl_EnumOverlayZOrders, + DGA_IDirectDrawSurface4Impl_Flip, + IDirectDrawSurface4Impl_GetAttachedSurface, + IDirectDrawSurface4Impl_GetBltStatus, + IDirectDrawSurface4Impl_GetCaps, + IDirectDrawSurface4Impl_GetClipper, + IDirectDrawSurface4Impl_GetColorKey, + IDirectDrawSurface4Impl_GetDC, + IDirectDrawSurface4Impl_GetFlipStatus, + IDirectDrawSurface4Impl_GetOverlayPosition, + IDirectDrawSurface4Impl_GetPalette, + IDirectDrawSurface4Impl_GetPixelFormat, + IDirectDrawSurface4Impl_GetSurfaceDesc, + IDirectDrawSurface4Impl_Initialize, + IDirectDrawSurface4Impl_IsLost, + IDirectDrawSurface4Impl_Lock, + IDirectDrawSurface4Impl_ReleaseDC, + IDirectDrawSurface4Impl_Restore, + IDirectDrawSurface4Impl_SetClipper, + IDirectDrawSurface4Impl_SetColorKey, + IDirectDrawSurface4Impl_SetOverlayPosition, + DGA_IDirectDrawSurface4Impl_SetPalette, + IDirectDrawSurface4Impl_Unlock, + IDirectDrawSurface4Impl_UpdateOverlay, + IDirectDrawSurface4Impl_UpdateOverlayDisplay, + IDirectDrawSurface4Impl_UpdateOverlayZOrder, + IDirectDrawSurface4Impl_GetDDInterface, + IDirectDrawSurface4Impl_PageLock, + IDirectDrawSurface4Impl_PageUnlock, + IDirectDrawSurface4Impl_SetSurfaceDesc, + IDirectDrawSurface4Impl_SetPrivateData, + IDirectDrawSurface4Impl_GetPrivateData, + IDirectDrawSurface4Impl_FreePrivateData, + IDirectDrawSurface4Impl_GetUniquenessValue, + IDirectDrawSurface4Impl_ChangeUniquenessValue +}; + +#ifdef HAVE_LIBXXF86DGA2 +ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IDirectDrawSurface4Impl_QueryInterface, + IDirectDrawSurface4Impl_AddRef, + DGA_IDirectDrawSurface4Impl_Release, + IDirectDrawSurface4Impl_AddAttachedSurface, + IDirectDrawSurface4Impl_AddOverlayDirtyRect, + IDirectDrawSurface4Impl_Blt, + IDirectDrawSurface4Impl_BltBatch, + IDirectDrawSurface4Impl_BltFast, + IDirectDrawSurface4Impl_DeleteAttachedSurface, + IDirectDrawSurface4Impl_EnumAttachedSurfaces, + IDirectDrawSurface4Impl_EnumOverlayZOrders, + DGA2_IDirectDrawSurface4Impl_Flip, + IDirectDrawSurface4Impl_GetAttachedSurface, + IDirectDrawSurface4Impl_GetBltStatus, + IDirectDrawSurface4Impl_GetCaps, + IDirectDrawSurface4Impl_GetClipper, + IDirectDrawSurface4Impl_GetColorKey, + IDirectDrawSurface4Impl_GetDC, + IDirectDrawSurface4Impl_GetFlipStatus, + IDirectDrawSurface4Impl_GetOverlayPosition, + IDirectDrawSurface4Impl_GetPalette, + IDirectDrawSurface4Impl_GetPixelFormat, + IDirectDrawSurface4Impl_GetSurfaceDesc, + IDirectDrawSurface4Impl_Initialize, + IDirectDrawSurface4Impl_IsLost, + IDirectDrawSurface4Impl_Lock, + IDirectDrawSurface4Impl_ReleaseDC, + IDirectDrawSurface4Impl_Restore, + IDirectDrawSurface4Impl_SetClipper, + IDirectDrawSurface4Impl_SetColorKey, + IDirectDrawSurface4Impl_SetOverlayPosition, + DGA_IDirectDrawSurface4Impl_SetPalette, + IDirectDrawSurface4Impl_Unlock, + IDirectDrawSurface4Impl_UpdateOverlay, + IDirectDrawSurface4Impl_UpdateOverlayDisplay, + IDirectDrawSurface4Impl_UpdateOverlayZOrder, + IDirectDrawSurface4Impl_GetDDInterface, + IDirectDrawSurface4Impl_PageLock, + IDirectDrawSurface4Impl_PageUnlock, + IDirectDrawSurface4Impl_SetSurfaceDesc, + IDirectDrawSurface4Impl_SetPrivateData, + IDirectDrawSurface4Impl_GetPrivateData, + IDirectDrawSurface4Impl_FreePrivateData, + IDirectDrawSurface4Impl_GetUniquenessValue, + IDirectDrawSurface4Impl_ChangeUniquenessValue +}; +#endif /* defined(HAVE_LIBXXF86DGA2) */ diff --git a/dlls/ddraw/dsurface/main.c b/dlls/ddraw/dsurface/main.c new file mode 100644 index 00000000000..13d8d6a89ac --- /dev/null +++ b/dlls/ddraw/dsurface/main.c @@ -0,0 +1,1145 @@ +/* DirectDrawSurface base implementation + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff) + */ +#include "config.h" +#include "winerror.h" + + +#include +#include +#include +#include +#include +#include + +#include "debugtools.h" +#include "ddraw_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +/****************************************************************************** + * IDirectDrawSurface methods + * + * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let + * DDS and DDS2 use those functions. (Function calls did not change (except + * using different DirectDrawSurfaceX version), just added flags and functions) + */ + +HRESULT WINAPI IDirectDrawSurface4Impl_Lock( + LPDIRECTDRAWSURFACE4 iface,LPRECT lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE hnd +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->Lock(%p,%p,%08lx,%08lx)\n", + This,lprect,lpddsd,flags,(DWORD)hnd); + if (flags & ~(DDLOCK_WAIT|DDLOCK_READONLY|DDLOCK_WRITEONLY)) + WARN("(%p)->Lock(%p,%p,%08lx,%08lx)\n", + This,lprect,lpddsd,flags,(DWORD)hnd); + + /* First, copy the Surface description */ + *lpddsd = This->s.surface_desc; + TRACE("locked surface: height=%ld, width=%ld, pitch=%ld\n", + lpddsd->dwHeight,lpddsd->dwWidth,lpddsd->lPitch); + + /* If asked only for a part, change the surface pointer */ + if (lprect) { + TRACE(" lprect: %dx%d-%dx%d\n", + lprect->top,lprect->left,lprect->bottom,lprect->right + ); + if ((lprect->top < 0) || + (lprect->left < 0) || + (lprect->bottom < 0) || + (lprect->right < 0)) { + ERR(" Negative values in LPRECT !!!\n"); + return DDERR_INVALIDPARAMS; + } + + lpddsd->u1.lpSurface = (LPVOID) ((char *) This->s.surface_desc.u1.lpSurface + + (lprect->top*This->s.surface_desc.lPitch) + + lprect->left*GET_BPP(This->s.surface_desc)); + } else { + assert(This->s.surface_desc.u1.lpSurface); + } + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_Unlock( + LPDIRECTDRAWSURFACE4 iface,LPVOID surface +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->Unlock(%p)\n",This,surface); + return DD_OK; +} + +IDirectDrawSurface4Impl* _common_find_flipto( + IDirectDrawSurface4Impl* This,IDirectDrawSurface4Impl* flipto +) { + int i,j,flipable=0; + struct _surface_chain *chain = This->s.chain; + + /* if there was no override flipto, look for current backbuffer */ + if (!flipto) { + /* walk the flip chain looking for backbuffer */ + for (i=0;inrofsurfaces;i++) { + if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_FLIP) + flipable++; + if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_BACKBUFFER) + flipto = chain->surfaces[i]; + } + /* sanity checks ... */ + if (!flipto) { + if (flipable>1) { + for (i=0;inrofsurfaces;i++) + if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_FRONTBUFFER) + break; + if (i==chain->nrofsurfaces) { + /* we do not have a frontbuffer either */ + for (i=0;inrofsurfaces;i++) + if (SDDSCAPS(chain->surfaces[i]) & DDSCAPS_FLIP) { + SDDSCAPS(chain->surfaces[i])|=DDSCAPS_FRONTBUFFER; + break; + } + for (j=i+1;jnrofsurfaces+1;j++) { + int k = j % chain->nrofsurfaces; + if (SDDSCAPS(chain->surfaces[k]) & DDSCAPS_FLIP) { + SDDSCAPS(chain->surfaces[k])|=DDSCAPS_BACKBUFFER; + flipto = chain->surfaces[k]; + break; + } + } + } + } + if (!flipto) + flipto = This; + } + TRACE("flipping to %p\n",flipto); + } + return flipto; +} + +static HRESULT _Blt_ColorFill( + LPBYTE buf, int width, int height, int bpp, LONG lPitch, DWORD color +) { + int x, y; + LPBYTE first; + + /* Do first row */ + +#define COLORFILL_ROW(type) { \ + type *d = (type *) buf; \ + for (x = 0; x < width; x++) \ + d[x] = (type) color; \ + break; \ +} + + switch(bpp) { + case 1: COLORFILL_ROW(BYTE) + case 2: COLORFILL_ROW(WORD) + case 4: COLORFILL_ROW(DWORD) + default: + FIXME("Color fill not implemented for bpp %d!\n", bpp*8); + return DDERR_UNSUPPORTED; + } + +#undef COLORFILL_ROW + + /* Now copy first row */ + first = buf; + for (y = 1; y < height; y++) { + buf += lPitch; + memcpy(buf, first, width * bpp); + } + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_Blt( + LPDIRECTDRAWSURFACE4 iface,LPRECT rdst,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc, + DWORD dwFlags,LPDDBLTFX lpbltfx +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + RECT xdst,xsrc; + DDSURFACEDESC ddesc,sdesc; + HRESULT ret = DD_OK; + int bpp, srcheight, srcwidth, dstheight, dstwidth, width; + int x, y; + LPBYTE dbuf, sbuf; + + TRACE("(%p)->(%p,%p,%p,%08lx,%p)\n", This,rdst,src,rsrc,dwFlags,lpbltfx); + + if (src) IDirectDrawSurface4_Lock(src, NULL, &sdesc, 0, 0); + IDirectDrawSurface4_Lock(iface,NULL,&ddesc,0,0); + + if (src && sdesc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + ERR("blitting FROM a primary surface? Hello?\n"); + if (!(ddesc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) + ERR("NOT blitting into a primary surface? Hello?\n"); + + if (TRACE_ON(ddraw)) { + if (rdst) TRACE("\tdestrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom); + if (rsrc) TRACE("\tsrcrect :%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); + TRACE("\tflags: "); + _dump_DDBLT(dwFlags); + if (dwFlags & DDBLT_DDFX) { + TRACE("\tblitfx: "); + _dump_DDBLTFX(lpbltfx->dwDDFX); + } + } + + if (rdst) { + if ((rdst->top < 0) || + (rdst->left < 0) || + (rdst->bottom < 0) || + (rdst->right < 0)) { + ERR(" Negative values in LPRECT !!!\n"); + goto release; + } + memcpy(&xdst,rdst,sizeof(xdst)); + } else { + xdst.top = 0; + xdst.bottom = ddesc.dwHeight; + xdst.left = 0; + xdst.right = ddesc.dwWidth; + } + + if (rsrc) { + if ((rsrc->top < 0) || + (rsrc->left < 0) || + (rsrc->bottom < 0) || + (rsrc->right < 0)) { + ERR(" Negative values in LPRECT !!!\n"); + goto release; + } + memcpy(&xsrc,rsrc,sizeof(xsrc)); + } else { + if (src) { + xsrc.top = 0; + xsrc.bottom = sdesc.dwHeight; + xsrc.left = 0; + xsrc.right = sdesc.dwWidth; + } else { + memset(&xsrc,0,sizeof(xsrc)); + } + } + assert(xsrc.bottom <= sdesc.dwHeight); + assert(xdst.bottom <= ddesc.dwHeight); + + bpp = GET_BPP(ddesc); + srcheight = xsrc.bottom - xsrc.top; + srcwidth = xsrc.right - xsrc.left; + dstheight = xdst.bottom - xdst.top; + dstwidth = xdst.right - xdst.left; + width = (xdst.right - xdst.left) * bpp; + + assert(width <= ddesc.lPitch); + + dbuf = (BYTE*)ddesc.u1.lpSurface+(xdst.top*ddesc.lPitch)+(xdst.left*bpp); + + dwFlags &= ~(DDBLT_WAIT|DDBLT_ASYNC);/* FIXME: can't handle right now */ + + /* First, all the 'source-less' blits */ + if (dwFlags & DDBLT_COLORFILL) { + ret = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, + ddesc.lPitch, lpbltfx->u4.dwFillColor); + dwFlags &= ~DDBLT_COLORFILL; + } + + if (dwFlags & DDBLT_DEPTHFILL) + FIXME("DDBLT_DEPTHFILL needs to be implemented!\n"); + if (dwFlags & DDBLT_ROP) { + /* Catch some degenerate cases here */ + switch(lpbltfx->dwROP) { + case BLACKNESS: + ret = _Blt_ColorFill(dbuf,dstwidth,dstheight,bpp,ddesc.lPitch,0); + break; + case 0xAA0029: /* No-op */ + break; + case WHITENESS: + ret = _Blt_ColorFill(dbuf,dstwidth,dstheight,bpp,ddesc.lPitch,~0); + break; + default: + FIXME("Unsupported raster op: %08lx Pattern: %p\n", lpbltfx->dwROP, lpbltfx->u4.lpDDSPattern); + goto error; + } + dwFlags &= ~DDBLT_ROP; + } + if (dwFlags & DDBLT_DDROPS) { + FIXME("\tDdraw Raster Ops: %08lx Pattern: %p\n", lpbltfx->dwDDROP, lpbltfx->u4.lpDDSPattern); + } + /* Now the 'with source' blits */ + if (src) { + LPBYTE sbase; + int sx, xinc, sy, yinc; + + sbase = (BYTE*)sdesc.u1.lpSurface+(xsrc.top*sdesc.lPitch)+xsrc.left*bpp; + xinc = (srcwidth << 16) / dstwidth; + yinc = (srcheight << 16) / dstheight; + + if (!dwFlags) { + assert(ddesc.lPitch >= width); + assert(sdesc.lPitch >= width); + + /* No effects, we can cheat here */ + if (dstwidth == srcwidth) { + if (dstheight == srcheight) { + /* No stretching in either direction. This needs to be as + * fast as possible */ + sbuf = sbase; + for (y = 0; y < dstheight; y++) { + memcpy(dbuf, sbuf, width); + sbuf += sdesc.lPitch; + dbuf += ddesc.lPitch; + } + } else { + /* Stretching in Y direction only */ + for (y = sy = 0; y < dstheight; y++, sy += yinc) { + sbuf = sbase + (sy >> 16) * sdesc.lPitch; + memcpy(dbuf, sbuf, width); + dbuf += ddesc.lPitch; + } + } + } else { + /* Stretching in X direction */ + int last_sy = -1; + for (y = sy = 0; y < dstheight; y++, sy += yinc) { + sbuf = sbase + (sy >> 16) * sdesc.lPitch; + + assert((sy>>16) < srcheight); + + if ((sy >> 16) == (last_sy >> 16)) { + /* this sourcerow is the same as last sourcerow - + * copy already stretched row + */ + memcpy(dbuf, dbuf - ddesc.lPitch, width); + } else { +#define STRETCH_ROW(type) { \ + type *s = (type *) sbuf, *d = (type *) dbuf; \ + for (x = sx = 0; x < dstwidth; x++, sx += xinc) \ + d[x] = s[sx >> 16]; \ + break; } + + switch(bpp) { + case 1: STRETCH_ROW(BYTE) + case 2: STRETCH_ROW(WORD) + case 4: STRETCH_ROW(DWORD) + case 3: { + LPBYTE s,d = dbuf; + for (x = sx = 0; x < dstwidth; x++, sx+= xinc) { + DWORD pixel; + + s = sbuf+3*(sx>>16); + pixel = (s[0]<<16)|(s[1]<<8)|s[2]; + d[0] = (pixel>>16)&0xff; + d[1] = (pixel>> 8)&0xff; + d[2] = (pixel )&0xff; + d+=3; + } + break; + } + default: + FIXME("Stretched blit not implemented for bpp %d!\n", bpp*8); + ret = DDERR_UNSUPPORTED; + goto error; + } +#undef STRETCH_ROW + } + dbuf += ddesc.lPitch; + last_sy = sy; + } + } + } else if (dwFlags & (DDBLT_KEYSRC | DDBLT_KEYDEST)) { + DWORD keylow, keyhigh; + + if (dwFlags & DDBLT_KEYSRC) { + keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue; + keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue; + } else { + /* I'm not sure if this is correct */ + FIXME("DDBLT_KEYDEST not fully supported yet.\n"); + keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue; + keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue; + } + + + for (y = sy = 0; y < dstheight; y++, sy += yinc) { + sbuf = sbase + (sy >> 16) * sdesc.lPitch; + +#define COPYROW_COLORKEY(type) { \ + type *s = (type *) sbuf, *d = (type *) dbuf, tmp; \ + for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \ + tmp = s[sx >> 16]; \ + if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \ + } \ + break; } + + switch (bpp) { + case 1: COPYROW_COLORKEY(BYTE) + case 2: COPYROW_COLORKEY(WORD) + case 4: COPYROW_COLORKEY(DWORD) + default: + FIXME("%s color-keyed blit not implemented for bpp %d!\n", + (dwFlags & DDBLT_KEYSRC) ? "Source" : "Destination", bpp*8); + ret = DDERR_UNSUPPORTED; + goto error; + } + dbuf += ddesc.lPitch; + } +#undef COPYROW_COLORKEY + dwFlags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST); + } + } + +error: + if (dwFlags && FIXME_ON(ddraw)) { + FIXME("\tUnsupported flags: "); + _dump_DDBLT(dwFlags); + } + +release: + IDirectDrawSurface4_Unlock(iface,ddesc.u1.lpSurface); + if (src) IDirectDrawSurface4_Unlock(src,sdesc.u1.lpSurface); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_BltFast( + LPDIRECTDRAWSURFACE4 iface,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE4 src, + LPRECT rsrc,DWORD trans +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + int bpp, w, h, x, y; + DDSURFACEDESC ddesc,sdesc; + HRESULT ret = DD_OK; + LPBYTE sbuf, dbuf; + RECT rsrc2; + + + if (TRACE_ON(ddraw)) { + FIXME("(%p)->(%ld,%ld,%p,%p,%08lx)\n", + This,dstx,dsty,src,rsrc,trans + ); + FIXME(" trans:"); + if (FIXME_ON(ddraw)) + _dump_DDBLTFAST(trans); + if (rsrc) + FIXME("\tsrcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); + else + FIXME(" srcrect: NULL\n"); + } + + /* We need to lock the surfaces, or we won't get refreshes when done. */ + IDirectDrawSurface4_Lock(src, NULL,&sdesc,DDLOCK_READONLY, 0); + IDirectDrawSurface4_Lock(iface,NULL,&ddesc,DDLOCK_WRITEONLY,0); + + if (!rsrc) { + WARN("rsrc is NULL!\n"); + rsrc = &rsrc2; + rsrc->left = rsrc->top = 0; + rsrc->right = sdesc.dwWidth; + rsrc->bottom = sdesc.dwHeight; + } + + bpp = GET_BPP(This->s.surface_desc); + sbuf = (BYTE *)sdesc.u1.lpSurface+(rsrc->top*sdesc.lPitch)+rsrc->left*bpp; + dbuf = (BYTE *)ddesc.u1.lpSurface+(dsty*ddesc.lPitch)+dstx* bpp; + + + h=rsrc->bottom-rsrc->top; + if (h>ddesc.dwHeight-dsty) h=ddesc.dwHeight-dsty; + if (h>sdesc.dwHeight-rsrc->top) h=sdesc.dwHeight-rsrc->top; + if (h<0) h=0; + + w=rsrc->right-rsrc->left; + if (w>ddesc.dwWidth-dstx) w=ddesc.dwWidth-dstx; + if (w>sdesc.dwWidth-rsrc->left) w=sdesc.dwWidth-rsrc->left; + if (w<0) w=0; + + if (trans & (DDBLTFAST_SRCCOLORKEY | DDBLTFAST_DESTCOLORKEY)) { + DWORD keylow, keyhigh; + if (trans & DDBLTFAST_SRCCOLORKEY) { + keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue; + keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue; + } else { + /* I'm not sure if this is correct */ + FIXME("DDBLTFAST_DESTCOLORKEY not fully supported yet.\n"); + keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue; + keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue; + } + +#define COPYBOX_COLORKEY(type) { \ + type *d = (type *)dbuf, *s = (type *)sbuf, tmp; \ + s = (type *) ((BYTE *) sdesc.u1.lpSurface + (rsrc->top * sdesc.lPitch) + rsrc->left * bpp); \ + d = (type *) ((BYTE *) ddesc.u1.lpSurface + (dsty * ddesc.lPitch) + dstx * bpp); \ + for (y = 0; y < h; y++) { \ + for (x = 0; x < w; x++) { \ + tmp = s[x]; \ + if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \ + } \ + (LPBYTE)s += sdesc.lPitch; \ + (LPBYTE)d += ddesc.lPitch; \ + } \ + break; \ +} + + switch (bpp) { + case 1: COPYBOX_COLORKEY(BYTE) + case 2: COPYBOX_COLORKEY(WORD) + case 4: COPYBOX_COLORKEY(DWORD) + default: + FIXME("Source color key blitting not supported for bpp %d\n",bpp*8); + ret = DDERR_UNSUPPORTED; + goto error; + } +#undef COPYBOX_COLORKEY + } else { + int width = w * bpp; + + for (y = 0; y < h; y++) { + memcpy(dbuf, sbuf, width); + sbuf += sdesc.lPitch; + dbuf += ddesc.lPitch; + } + } +error: + IDirectDrawSurface4_Unlock(iface,ddesc.u1.lpSurface); + IDirectDrawSurface4_Unlock(src,sdesc.u1.lpSurface); + return ret; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_BltBatch( + LPDIRECTDRAWSURFACE4 iface,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",This,ddbltbatch,x,y); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetCaps( + LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS caps +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->GetCaps(%p)\n",This,caps); + caps->dwCaps = DDSCAPS_PALETTE; /* probably more */ + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetSurfaceDesc( + LPDIRECTDRAWSURFACE4 iface,LPDDSURFACEDESC ddsd +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->GetSurfaceDesc(%p)\n", This,ddsd); + + /* Simply copy the surface description stored in the object */ + *ddsd = This->s.surface_desc; + + if (TRACE_ON(ddraw)) { _dump_surface_desc(ddsd); } + + return DD_OK; +} + +ULONG WINAPI IDirectDrawSurface4Impl_AddRef(LPDIRECTDRAWSURFACE4 iface) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->() incrementing from %lu.\n", This, This->ref ); + return ++(This->ref); +} + + +HRESULT WINAPI IDirectDrawSurface4Impl_GetAttachedSurface( + LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE4 *lpdsf +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + int i,found = 0,xstart; + struct _surface_chain *chain; + + TRACE("(%p)->GetAttachedSurface(%p,%p)\n", This, lpddsd, lpdsf); + if (TRACE_ON(ddraw)) { + TRACE(" caps ");_dump_DDSCAPS((void *) &(lpddsd->dwCaps)); + DPRINTF("\n"); + } + chain = This->s.chain; + if (!chain) + return DDERR_NOTFOUND; + + for (i=0;inrofsurfaces;i++) + if (chain->surfaces[i] == This) + break; + + xstart = i; + for (i=0;inrofsurfaces;i++) { + if ((SDDSCAPS(chain->surfaces[(xstart+i)%chain->nrofsurfaces])&lpddsd->dwCaps) == lpddsd->dwCaps) { +#if 0 + if (found) /* may not find the same caps twice, (doc) */ + return DDERR_INVALIDPARAMS;/*FIXME: correct? */ +#endif + found = (i+1)+xstart; + } + } + if (!found) + return DDERR_NOTFOUND; + *lpdsf = (LPDIRECTDRAWSURFACE4)chain->surfaces[found-1-xstart]; + /* FIXME: AddRef? */ + TRACE("found %p\n",*lpdsf); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_Initialize( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->(%p, %p)\n",This,ddraw,lpdsfd); + + return DDERR_ALREADYINITIALIZED; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetPixelFormat( + LPDIRECTDRAWSURFACE4 iface,LPDDPIXELFORMAT pf +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->(%p)\n",This,pf); + + *pf = This->s.surface_desc.ddpfPixelFormat; + if (TRACE_ON(ddraw)) { _dump_pixelformat(pf); DPRINTF("\n"); } + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetBltStatus(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(0x%08lx),stub!\n",This,dwFlags); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetOverlayPosition( + LPDIRECTDRAWSURFACE4 iface,LPLONG x1,LPLONG x2 +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p,%p),stub!\n",This,x1,x2); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_SetClipper( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWCLIPPER lpClipper +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->(%p)!\n",This,lpClipper); + + if (This->s.lpClipper) IDirectDrawClipper_Release( This->s.lpClipper ); + This->s.lpClipper = lpClipper; + if (lpClipper) IDirectDrawClipper_AddRef( lpClipper ); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_AddAttachedSurface( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 surf +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + IDirectDrawSurface4Impl*isurf = (IDirectDrawSurface4Impl*)surf; + int i; + struct _surface_chain *chain; + + FIXME("(%p)->(%p)\n",This,surf); + chain = This->s.chain; + + /* IDirectDrawSurface4_AddRef(surf); */ + + if (chain) { + for (i=0;inrofsurfaces;i++) + if (chain->surfaces[i] == isurf) + FIXME("attaching already attached surface %p to %p!\n",iface,isurf); + } else { + chain = HeapAlloc(GetProcessHeap(),0,sizeof(*chain)); + chain->nrofsurfaces = 1; + chain->surfaces = HeapAlloc(GetProcessHeap(),0,sizeof(chain->surfaces[0])); + chain->surfaces[0] = This; + This->s.chain = chain; + } + + if (chain->surfaces) + chain->surfaces = HeapReAlloc( + GetProcessHeap(), + 0, + chain->surfaces, + sizeof(chain->surfaces[0])*(chain->nrofsurfaces+1) + ); + else + chain->surfaces = HeapAlloc(GetProcessHeap(),0,sizeof(chain->surfaces[0])); + isurf->s.chain = chain; + chain->surfaces[chain->nrofsurfaces++] = isurf; + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetDC(LPDIRECTDRAWSURFACE4 iface,HDC* lphdc) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + DDSURFACEDESC desc; + BITMAPINFO *b_info; + UINT usage; + + FIXME("(%p)->GetDC(%p)\n",This,lphdc); + + /* Creates a DIB Section of the same size / format as the surface */ + IDirectDrawSurface4_Lock(iface,NULL,&desc,0,0); + + if (This->s.hdc == 0) { + switch (desc.ddpfPixelFormat.u.dwRGBBitCount) { + case 16: + case 32: +#if 0 /* This should be filled if Wine's DIBSection did understand BI_BITFIELDS */ + b_info = (BITMAPINFO *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + 3 * sizeof(DWORD)); + break; +#endif + + case 24: + b_info = (BITMAPINFO *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER)); + break; + + default: + b_info = (BITMAPINFO *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (2 << desc.ddpfPixelFormat.u.dwRGBBitCount)); + break; + } + + b_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + b_info->bmiHeader.biWidth = desc.dwWidth; + b_info->bmiHeader.biHeight = desc.dwHeight; + b_info->bmiHeader.biPlanes = 1; + b_info->bmiHeader.biBitCount = desc.ddpfPixelFormat.u.dwRGBBitCount; +#if 0 + if ((desc.ddpfPixelFormat.u.dwRGBBitCount != 16) && + (desc.ddpfPixelFormat.u.dwRGBBitCount != 32)) +#endif + b_info->bmiHeader.biCompression = BI_RGB; +#if 0 + else + b_info->bmiHeader.biCompression = BI_BITFIELDS; +#endif + b_info->bmiHeader.biSizeImage = (desc.ddpfPixelFormat.u.dwRGBBitCount / 8) * desc.dwWidth * desc.dwHeight; + b_info->bmiHeader.biXPelsPerMeter = 0; + b_info->bmiHeader.biYPelsPerMeter = 0; + b_info->bmiHeader.biClrUsed = 0; + b_info->bmiHeader.biClrImportant = 0; + + switch (desc.ddpfPixelFormat.u.dwRGBBitCount) { + case 16: + case 32: +#if 0 + { + DWORD *masks = (DWORD *) &(b_info->bmiColors); + + usage = 0; + masks[0] = desc.ddpfPixelFormat.u1.dwRBitMask; + masks[1] = desc.ddpfPixelFormat.u2.dwGBitMask; + masks[2] = desc.ddpfPixelFormat.u3.dwBBitMask; + } + break; +#endif + case 24: + /* Nothing to do */ + usage = DIB_RGB_COLORS; + break; + + default: { + int i; + + /* Fill the palette */ + usage = DIB_RGB_COLORS; + + if (This->s.palette == NULL) { + ERR("Bad palette !!!\n"); + } else { + RGBQUAD *rgb = (RGBQUAD *) &(b_info->bmiColors); + PALETTEENTRY *pent = (PALETTEENTRY *)&(This->s.palette->palents); + + for (i=0;i<(1<s.DIBsection = CreateDIBSection(BeginPaint(This->s.ddraw->d.mainWindow,&This->s.ddraw->d.ps), + b_info, + usage, + &(This->s.bitmap_data), + 0, + 0 + ); + EndPaint(This->s.ddraw->d.mainWindow,&This->s.ddraw->d.ps); + if (!This->s.DIBsection) { + ERR("CreateDIBSection failed!\n"); + return E_FAIL; + } + TRACE("DIBSection at : %p\n", This->s.bitmap_data); + + /* b_info is not useful anymore */ + HeapFree(GetProcessHeap(), 0, b_info); + + /* Create the DC */ + This->s.hdc = CreateCompatibleDC(0); + This->s.holdbitmap = SelectObject(This->s.hdc, This->s.DIBsection); + } + + /* Copy our surface in the DIB section */ + if ((GET_BPP(desc) * desc.dwWidth) == desc.lPitch) + memcpy(This->s.bitmap_data,desc.u1.lpSurface,desc.lPitch*desc.dwHeight); + else + /* TODO */ + FIXME("This case has to be done :/\n"); + + TRACE("HDC : %08lx\n", (DWORD) This->s.hdc); + *lphdc = This->s.hdc; + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_ReleaseDC(LPDIRECTDRAWSURFACE4 iface,HDC hdc) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + + FIXME("(%p)->(0x%08lx),stub!\n",This,(long)hdc); + TRACE( "Copying DIBSection at : %p\n", This->s.bitmap_data); + /* Copy the DIB section to our surface */ + if ((GET_BPP(This->s.surface_desc) * This->s.surface_desc.dwWidth) == This->s.surface_desc.lPitch) { + memcpy(This->s.surface_desc.u1.lpSurface, This->s.bitmap_data, This->s.surface_desc.lPitch * This->s.surface_desc.dwHeight); + } else { + /* TODO */ + FIXME("This case has to be done :/\n"); + } + /* Unlock the surface */ + IDirectDrawSurface4_Unlock(iface,This->s.surface_desc.u1.lpSurface); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_QueryInterface( + LPDIRECTDRAWSURFACE4 iface,REFIID refiid,LPVOID *obj +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + + /* All DirectDrawSurface versions (1, 2, 3 and 4) use + * the same interface. And IUnknown does that too of course. + */ + if ( IsEqualGUID( &IID_IDirectDrawSurface4, refiid ) || + IsEqualGUID( &IID_IDirectDrawSurface3, refiid ) || + IsEqualGUID( &IID_IDirectDrawSurface2, refiid ) || + IsEqualGUID( &IID_IDirectDrawSurface, refiid ) || + IsEqualGUID( &IID_IUnknown, refiid ) + ) { + *obj = This; + IDirectDrawSurface4_AddRef(iface); + + TRACE(" Creating IDirectDrawSurface interface (%p)\n", *obj); + return S_OK; + } + FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_IsLost(LPDIRECTDRAWSURFACE4 iface) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->(), stub!\n",This); + return DD_OK; /* hmm */ +} + +HRESULT WINAPI IDirectDrawSurface4Impl_EnumAttachedSurfaces( + LPDIRECTDRAWSURFACE4 iface,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + int i; + struct _surface_chain *chain = This->s.chain; + + TRACE("(%p)->(%p,%p)\n",This,context,esfcb); + for (i=0;inrofsurfaces;i++) { + TRACE( "Enumerating attached surface (%p)\n", chain->surfaces[i]); + if (esfcb((LPDIRECTDRAWSURFACE) chain->surfaces[i], &(chain->surfaces[i]->s.surface_desc), context) == DDENUMRET_CANCEL) + return DD_OK; /* FIXME: return value correct? */ + } + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_Restore(LPDIRECTDRAWSURFACE4 iface) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(),stub!\n",This); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_SetColorKey( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags, LPDDCOLORKEY ckey ) +{ + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->(0x%08lx,%p)\n",This,dwFlags,ckey); + if (TRACE_ON(ddraw)) { + _dump_colorkeyflag(dwFlags); + DPRINTF(" : "); + _dump_DDCOLORKEY((void *) ckey); + DPRINTF("\n"); + } + + /* If this surface was loaded as a texture, call also the texture + * SetColorKey callback. FIXME: hack approach :( + */ + if (This->s.texture) + This->s.SetColorKey_cb(This->s.texture, dwFlags, ckey); + + if( dwFlags & DDCKEY_SRCBLT ) { + dwFlags &= ~DDCKEY_SRCBLT; + This->s.surface_desc.dwFlags |= DDSD_CKSRCBLT; + memcpy( &(This->s.surface_desc.ddckCKSrcBlt), ckey, sizeof( *ckey ) ); + } + + if( dwFlags & DDCKEY_DESTBLT ) { + dwFlags &= ~DDCKEY_DESTBLT; + This->s.surface_desc.dwFlags |= DDSD_CKDESTBLT; + memcpy( &(This->s.surface_desc.ddckCKDestBlt), ckey, sizeof( *ckey ) ); + } + + if( dwFlags & DDCKEY_SRCOVERLAY ) { + dwFlags &= ~DDCKEY_SRCOVERLAY; + This->s.surface_desc.dwFlags |= DDSD_CKSRCOVERLAY; + memcpy( &(This->s.surface_desc.ddckCKSrcOverlay), ckey, sizeof( *ckey ) ); + } + + if( dwFlags & DDCKEY_DESTOVERLAY ) { + dwFlags &= ~DDCKEY_DESTOVERLAY; + This->s.surface_desc.dwFlags |= DDSD_CKDESTOVERLAY; + memcpy( &(This->s.surface_desc.ddckCKDestOverlay), ckey, sizeof( *ckey ) ); + } + if( dwFlags ) + FIXME("unhandled dwFlags: 0x%08lx\n", dwFlags ); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_AddOverlayDirtyRect( + LPDIRECTDRAWSURFACE4 iface, LPRECT lpRect +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p),stub!\n",This,lpRect); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_DeleteAttachedSurface( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags, + LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + int i; + struct _surface_chain *chain; + + TRACE("(%p)->(0x%08lx,%p)\n",This,dwFlags,lpDDSAttachedSurface); + chain = This->s.chain; + for (i=0;inrofsurfaces;i++) { + if ((IDirectDrawSurface4Impl*)lpDDSAttachedSurface==chain->surfaces[i]){ + IDirectDrawSurface4_Release(lpDDSAttachedSurface); + + chain->surfaces[i]->s.chain = NULL; + memcpy( chain->surfaces+i, + chain->surfaces+(i+1), + (chain->nrofsurfaces-i-1)*sizeof(chain->surfaces[i]) + ); + chain->surfaces = HeapReAlloc( + GetProcessHeap(), + 0, + chain->surfaces, + sizeof(chain->surfaces[i])*(chain->nrofsurfaces-1) + ); + chain->nrofsurfaces--; + return DD_OK; + } + } + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_EnumOverlayZOrders( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags, LPVOID lpContext, + LPDDENUMSURFACESCALLBACK lpfnCallback +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(0x%08lx,%p,%p),stub!\n", This,dwFlags, + lpContext, lpfnCallback ); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetClipper( + LPDIRECTDRAWSURFACE4 iface, LPDIRECTDRAWCLIPPER* lplpDDClipper +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p),stub!\n", This, lplpDDClipper); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetColorKey( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags, LPDDCOLORKEY lpDDColorKey +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->(0x%08lx,%p)\n", This, dwFlags, lpDDColorKey); + + if( dwFlags & DDCKEY_SRCBLT ) { + dwFlags &= ~DDCKEY_SRCBLT; + memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKSrcBlt), sizeof( *lpDDColorKey ) ); + } + if( dwFlags & DDCKEY_DESTBLT ) { + dwFlags &= ~DDCKEY_DESTBLT; + memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKDestBlt), sizeof( *lpDDColorKey ) ); + } + if( dwFlags & DDCKEY_SRCOVERLAY ) { + dwFlags &= ~DDCKEY_SRCOVERLAY; + memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKSrcOverlay), sizeof( *lpDDColorKey ) ); + } + if( dwFlags & DDCKEY_DESTOVERLAY ) { + dwFlags &= ~DDCKEY_DESTOVERLAY; + memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKDestOverlay), sizeof( *lpDDColorKey ) ); + } + if( dwFlags ) + FIXME("unhandled dwFlags: 0x%08lx\n", dwFlags ); + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetFlipStatus( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetPalette( + LPDIRECTDRAWSURFACE4 iface, LPDIRECTDRAWPALETTE* lplpDDPalette +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + TRACE("(%p)->(%p),stub!\n", This, lplpDDPalette); + + if (!This->s.palette) + return DDERR_NOPALETTEATTACHED; + + IDirectDrawPalette_AddRef( (IDirectDrawPalette*) This->s.palette ); + *lplpDDPalette = (IDirectDrawPalette*) This->s.palette; + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_SetOverlayPosition( + LPDIRECTDRAWSURFACE4 iface, LONG lX, LONG lY +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%ld,%ld),stub!\n", This, lX, lY); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlay( + LPDIRECTDRAWSURFACE4 iface, LPRECT lpSrcRect, + LPDIRECTDRAWSURFACE4 lpDDDestSurface, LPRECT lpDestRect, DWORD dwFlags, + LPDDOVERLAYFX lpDDOverlayFx +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p,%p,%p,0x%08lx,%p),stub!\n", This, + lpSrcRect, lpDDDestSurface, lpDestRect, dwFlags, lpDDOverlayFx ); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayDisplay( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayZOrder( + LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags,LPDIRECTDRAWSURFACE4 lpDDSReference +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(0x%08lx,%p),stub!\n", This, dwFlags, lpDDSReference); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetDDInterface( + LPDIRECTDRAWSURFACE4 iface, LPVOID* lplpDD +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p),stub!\n", This, lplpDD); + + /* Not sure about that... */ + *lplpDD = (void *) This->s.ddraw; + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_PageLock( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_PageUnlock( + LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(0x%08lx),stub!\n", This, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_SetSurfaceDesc( + LPDIRECTDRAWSURFACE4 iface, LPDDSURFACEDESC lpDDSD, DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p,0x%08lx),stub!\n", This, lpDDSD, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_SetPrivateData( + LPDIRECTDRAWSURFACE4 iface, REFGUID guidTag, LPVOID lpData, DWORD cbSize, + DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p,%p,%ld,%08lx\n", This, guidTag, lpData, cbSize, dwFlags); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetPrivateData( + LPDIRECTDRAWSURFACE4 iface, REFGUID guidTag, LPVOID lpBuffer, + LPDWORD lpcbBufferSize +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p,%p,%p)\n", This, guidTag, lpBuffer, lpcbBufferSize); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_FreePrivateData( + LPDIRECTDRAWSURFACE4 iface, REFGUID guidTag +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p)\n", This, guidTag); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_GetUniquenessValue( + LPDIRECTDRAWSURFACE4 iface, LPDWORD lpValue +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)->(%p)\n", This, lpValue); + + return DD_OK; +} + +HRESULT WINAPI IDirectDrawSurface4Impl_ChangeUniquenessValue( + LPDIRECTDRAWSURFACE4 iface +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + FIXME("(%p)\n", This); + + return DD_OK; +} diff --git a/dlls/ddraw/dsurface/x11.c b/dlls/ddraw/dsurface/x11.c new file mode 100644 index 00000000000..bd7f28af5e0 --- /dev/null +++ b/dlls/ddraw/dsurface/x11.c @@ -0,0 +1,423 @@ +/* DirectDrawSurface Xlib implementation + * + * Copyright 1997-2000 Marcus Meissner + * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff) + */ +#include "config.h" +#include "winerror.h" + +#include +#include +#include +#include +#include +#include + +#include "options.h" +#include "debugtools.h" +#include "x11_private.h" + +#ifdef HAVE_MESAGL +/* for d3d texture stuff */ +# include "mesa_private.h" +#endif + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#define VISIBLE(x) (SDDSCAPS(x) & (DDSCAPS_VISIBLE|DDSCAPS_PRIMARYSURFACE)) + +#define DDPRIVATE(x) x11_dd_private *ddpriv = ((x11_dd_private*)(x)->private) +#define DPPRIVATE(x) x11_dp_private *dppriv = ((x11_dp_private*)(x)->private) +#define DSPRIVATE(x) x11_ds_private *dspriv = ((x11_ds_private*)(x)->private) + +/****************************************************************************** + * IDirectDrawSurface methods + * + * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let + * DDS and DDS2 use those functions. (Function calls did not change (except + * using different DirectDrawSurfaceX version), just added flags and functions) + */ +HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_QueryInterface( + LPDIRECTDRAWSURFACE4 iface,REFIID refiid,LPVOID *obj +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + + /* All DirectDrawSurface versions (1, 2, 3 and 4) use + * the same interface. And IUnknown does that too of course. + */ + if ( IsEqualGUID( &IID_IDirectDrawSurface4, refiid ) || + IsEqualGUID( &IID_IDirectDrawSurface3, refiid ) || + IsEqualGUID( &IID_IDirectDrawSurface2, refiid ) || + IsEqualGUID( &IID_IDirectDrawSurface, refiid ) || + IsEqualGUID( &IID_IUnknown, refiid ) + ) { + *obj = This; + IDirectDrawSurface4_AddRef(iface); + + TRACE(" Creating IDirectDrawSurface interface (%p)\n", *obj); + return S_OK; + } +#ifdef HAVE_MESAGL + if ( IsEqualGUID( &IID_IDirect3DTexture2, refiid ) ) { + /* Texture interface */ + *obj = d3dtexture2_create(This); + IDirectDrawSurface4_AddRef(iface); + TRACE(" Creating IDirect3DTexture2 interface (%p)\n", *obj); + return S_OK; + } + if ( IsEqualGUID( &IID_IDirect3DTexture, refiid ) ) { + /* Texture interface */ + *obj = d3dtexture_create(This); + IDirectDrawSurface4_AddRef(iface); + TRACE(" Creating IDirect3DTexture interface (%p)\n", *obj); + return S_OK; + } +#endif /* HAVE_MESAGL */ + FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid)); + return OLE_E_ENUM_NOMORE; +} + +HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_Lock( + LPDIRECTDRAWSURFACE4 iface,LPRECT lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE hnd +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + DSPRIVATE(This); + DDPRIVATE(This->s.ddraw); + + IDirectDrawSurface4_AddRef(iface); + assert(HeapValidate(GetProcessHeap(),0,NULL)); + + TRACE("(%p)->Lock(%p,%p,%08lx,%08lx)\n",This,lprect,lpddsd,flags,(DWORD)hnd); + if (flags & ~(DDLOCK_WAIT|DDLOCK_READONLY|DDLOCK_WRITEONLY)) + WARN("(%p)->Lock(%p,%p,%08lx,%08lx)\n", + This,lprect,lpddsd,flags,(DWORD)hnd); + + /* First, copy the Surface description */ + *lpddsd = This->s.surface_desc; + TRACE("locked surface: height=%ld, width=%ld, pitch=%ld\n", + lpddsd->dwHeight,lpddsd->dwWidth,lpddsd->lPitch); + + /* If asked only for a part, change the surface pointer */ + if (lprect) { + TRACE(" lprect: %dx%d-%dx%d\n", + lprect->top,lprect->left,lprect->bottom,lprect->right + ); + if ((lprect->top < 0) || + (lprect->left < 0) || + (lprect->bottom < 0) || + (lprect->right < 0)) { + ERR(" Negative values in LPRECT !!!\n"); + IDirectDrawSurface4_Release(iface); + return DDERR_INVALIDPARAMS; + } + lpddsd->u1.lpSurface=(LPVOID)((char*)This->s.surface_desc.u1.lpSurface+ + (lprect->top*This->s.surface_desc.lPitch) + + lprect->left*GET_BPP(This->s.surface_desc)); + } else + assert(This->s.surface_desc.u1.lpSurface); + /* wait for any previous operations to complete */ +#ifdef HAVE_LIBXXSHM + if (dspriv->image && VISIBLE(This) && ddpriv->xshm_active) { +/* + int compl = InterlockedExchange( &(ddpriv->xshm_compl), 0 ); + if (compl) X11DRV_EVENT_WaitShmCompletion( compl ); +*/ + X11DRV_EVENT_WaitShmCompletions( ddpriv->drawable ); + } +#endif + return DD_OK; +} + +static void Xlib_copy_surface_on_screen(IDirectDrawSurface4Impl* This) { + DSPRIVATE(This); + DDPRIVATE(This->s.ddraw); + if (This->s.ddraw->d.pixel_convert != NULL) + This->s.ddraw->d.pixel_convert(This->s.surface_desc.u1.lpSurface, + dspriv->image->data, + This->s.surface_desc.dwWidth, + This->s.surface_desc.dwHeight, + This->s.surface_desc.lPitch, + This->s.palette); + +#ifdef HAVE_LIBXXSHM + if (ddpriv->xshm_active) { +/* + X11DRV_EVENT_WaitReplaceShmCompletion( &(ddpriv->xshm_compl), This->s.ddraw->d.drawable ); +*/ + /* let WaitShmCompletions track 'em for now */ + /* (you may want to track it again whenever you implement DX7's partial + * surface locking, where threads have concurrent access) */ + X11DRV_EVENT_PrepareShmCompletion( ddpriv->drawable ); + TSXShmPutImage(display, + ddpriv->drawable, + DefaultGCOfScreen(X11DRV_GetXScreen()), + dspriv->image, + 0, 0, 0, 0, + dspriv->image->width, + dspriv->image->height, + True + ); + /* make sure the image is transferred ASAP */ + TSXFlush(display); + } else +#endif + TSXPutImage( + display, + ddpriv->drawable, + DefaultGCOfScreen(X11DRV_GetXScreen()), + dspriv->image, + 0, 0, 0, 0, + dspriv->image->width, + dspriv->image->height + ); +} + +HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_Unlock( + LPDIRECTDRAWSURFACE4 iface,LPVOID surface +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + DDPRIVATE(This->s.ddraw); + DSPRIVATE(This); + TRACE("(%p)->Unlock(%p)\n",This,surface); + + /*if (!This->s.ddraw->d.paintable) + return DD_OK; */ + + /* Only redraw the screen when unlocking the buffer that is on screen */ + if (dspriv->image && VISIBLE(This)) { + Xlib_copy_surface_on_screen(This); + if (This->s.palette) { + DPPRIVATE(This->s.palette); + if(dppriv->cm) + TSXSetWindowColormap(display,ddpriv->drawable,dppriv->cm); + } + } + assert(HeapValidate(GetProcessHeap(),0,NULL)); + IDirectDrawSurface4_Release(iface); + return DD_OK; +} + +HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_Flip( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + XImage *image; + DDPRIVATE(This->s.ddraw); + DSPRIVATE(This); + x11_ds_private *fspriv; + LPBYTE surf; + IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto; + + TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags); + if (!This->s.ddraw->d.paintable) + return DD_OK; + + iflipto = _common_find_flipto(This,iflipto); + fspriv = (x11_ds_private*)iflipto->private; + + /* We need to switch the lowlevel surfaces, for xlib this is: */ + /* The surface pointer */ + surf = This->s.surface_desc.u1.lpSurface; + This->s.surface_desc.u1.lpSurface = iflipto->s.surface_desc.u1.lpSurface; + iflipto->s.surface_desc.u1.lpSurface = surf; + + /* the associated ximage */ + image = dspriv->image; + dspriv->image = fspriv->image; + fspriv->image = image; + +#ifdef HAVE_LIBXXSHM + if (ddpriv->xshm_active) { +/* + int compl = InterlockedExchange( &(ddpriv->xshm_compl), 0 ); + if (compl) X11DRV_EVENT_WaitShmCompletion( compl ); +*/ + X11DRV_EVENT_WaitShmCompletions( ddpriv->drawable ); + } +#endif + Xlib_copy_surface_on_screen(This); + if (iflipto->s.palette) { + DPPRIVATE(iflipto->s.palette); + if (dppriv->cm) + TSXSetWindowColormap(display,ddpriv->drawable,dppriv->cm); + } + return DD_OK; +} + +/* The IDirectDrawSurface4::SetPalette method attaches the specified + * DirectDrawPalette object to a surface. The surface uses this palette for all + * subsequent operations. The palette change takes place immediately. + */ +HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_SetPalette( + LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal +) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + DDPRIVATE(This->s.ddraw); + IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal; + x11_dp_private *dppriv; + int i; + + TRACE("(%p)->(%p)\n",This,ipal); + + if (ipal == NULL) { + if( This->s.palette != NULL ) + IDirectDrawPalette_Release((IDirectDrawPalette*)This->s.palette); + This->s.palette = ipal; + return DD_OK; + } + dppriv = (x11_dp_private*)ipal->private; + + if (!dppriv->cm && + (This->s.ddraw->d.screen_pixelformat.u.dwRGBBitCount<=8) + ) { + dppriv->cm = TSXCreateColormap( + display, + ddpriv->drawable, + DefaultVisualOfScreen(X11DRV_GetXScreen()), + AllocAll + ); + if (!Options.managed) + TSXInstallColormap(display,dppriv->cm); + + for (i=0;i<256;i++) { + XColor xc; + + xc.red = ipal->palents[i].peRed<<8; + xc.blue = ipal->palents[i].peBlue<<8; + xc.green = ipal->palents[i].peGreen<<8; + xc.flags = DoRed|DoBlue|DoGreen; + xc.pixel = i; + TSXStoreColor(display,dppriv->cm,&xc); + } + TSXInstallColormap(display,dppriv->cm); + } + /* According to spec, we are only supposed to + * AddRef if this is not the same palette. + */ + if ( This->s.palette != ipal ) { + if( ipal != NULL ) + IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal ); + if( This->s.palette != NULL ) + IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette ); + This->s.palette = ipal; + /* Perform the refresh */ + TSXSetWindowColormap(display,ddpriv->drawable,dppriv->cm); + } + return DD_OK; +} + +ULONG WINAPI Xlib_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) { + ICOM_THIS(IDirectDrawSurface4Impl,iface); + DSPRIVATE(This); + DDPRIVATE(This->s.ddraw); + + TRACE( "(%p)->() decrementing from %lu.\n", This, This->ref ); + if (--(This->ref)) + return This->ref; + + IDirectDraw2_Release((IDirectDraw2*)This->s.ddraw); + + if (dspriv->image != NULL) { + if (This->s.ddraw->d.pixel_convert != NULL) { + /* In pixel conversion mode, there are 2 buffers to release. */ + HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); + +#ifdef HAVE_LIBXXSHM + if (ddpriv->xshm_active) { + TSXShmDetach(display, &(dspriv->shminfo)); + TSXDestroyImage(dspriv->image); + shmdt(dspriv->shminfo.shmaddr); + } else +#endif + { + HeapFree(GetProcessHeap(),0,dspriv->image->data); + dspriv->image->data = NULL; + TSXDestroyImage(dspriv->image); + } + } else { + dspriv->image->data = NULL; + +#ifdef HAVE_LIBXXSHM + if (ddpriv->xshm_active) { + TSXShmDetach(display, &(dspriv->shminfo)); + TSXDestroyImage(dspriv->image); + shmdt(dspriv->shminfo.shmaddr); + } else +#endif + { + HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); + TSXDestroyImage(dspriv->image); + } + } + dspriv->image = 0; + } else + HeapFree(GetProcessHeap(),0,This->s.surface_desc.u1.lpSurface); + + if (This->s.palette) + IDirectDrawPalette_Release((IDirectDrawPalette*)This->s.palette); + + /* Free the DIBSection (if any) */ + if (This->s.hdc != 0) { + SelectObject(This->s.hdc, This->s.holdbitmap); + DeleteDC(This->s.hdc); + DeleteObject(This->s.DIBsection); + } + + /* Free the clipper if present */ + if(This->s.lpClipper) + IDirectDrawClipper_Release(This->s.lpClipper); + HeapFree(GetProcessHeap(),0,This); + return S_OK; +} + +ICOM_VTABLE(IDirectDrawSurface4) xlib_dds4vt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + Xlib_IDirectDrawSurface4Impl_QueryInterface, + IDirectDrawSurface4Impl_AddRef, + Xlib_IDirectDrawSurface4Impl_Release, + IDirectDrawSurface4Impl_AddAttachedSurface, + IDirectDrawSurface4Impl_AddOverlayDirtyRect, + IDirectDrawSurface4Impl_Blt, + IDirectDrawSurface4Impl_BltBatch, + IDirectDrawSurface4Impl_BltFast, + IDirectDrawSurface4Impl_DeleteAttachedSurface, + IDirectDrawSurface4Impl_EnumAttachedSurfaces, + IDirectDrawSurface4Impl_EnumOverlayZOrders, + Xlib_IDirectDrawSurface4Impl_Flip, + IDirectDrawSurface4Impl_GetAttachedSurface, + IDirectDrawSurface4Impl_GetBltStatus, + IDirectDrawSurface4Impl_GetCaps, + IDirectDrawSurface4Impl_GetClipper, + IDirectDrawSurface4Impl_GetColorKey, + IDirectDrawSurface4Impl_GetDC, + IDirectDrawSurface4Impl_GetFlipStatus, + IDirectDrawSurface4Impl_GetOverlayPosition, + IDirectDrawSurface4Impl_GetPalette, + IDirectDrawSurface4Impl_GetPixelFormat, + IDirectDrawSurface4Impl_GetSurfaceDesc, + IDirectDrawSurface4Impl_Initialize, + IDirectDrawSurface4Impl_IsLost, + Xlib_IDirectDrawSurface4Impl_Lock, + IDirectDrawSurface4Impl_ReleaseDC, + IDirectDrawSurface4Impl_Restore, + IDirectDrawSurface4Impl_SetClipper, + IDirectDrawSurface4Impl_SetColorKey, + IDirectDrawSurface4Impl_SetOverlayPosition, + Xlib_IDirectDrawSurface4Impl_SetPalette, + Xlib_IDirectDrawSurface4Impl_Unlock, + IDirectDrawSurface4Impl_UpdateOverlay, + IDirectDrawSurface4Impl_UpdateOverlayDisplay, + IDirectDrawSurface4Impl_UpdateOverlayZOrder, + IDirectDrawSurface4Impl_GetDDInterface, + IDirectDrawSurface4Impl_PageLock, + IDirectDrawSurface4Impl_PageUnlock, + IDirectDrawSurface4Impl_SetSurfaceDesc, + IDirectDrawSurface4Impl_SetPrivateData, + IDirectDrawSurface4Impl_GetPrivateData, + IDirectDrawSurface4Impl_FreePrivateData, + IDirectDrawSurface4Impl_GetUniquenessValue, + IDirectDrawSurface4Impl_ChangeUniquenessValue +}; diff --git a/dlls/ddraw/helper.c b/dlls/ddraw/helper.c new file mode 100644 index 00000000000..366af360347 --- /dev/null +++ b/dlls/ddraw/helper.c @@ -0,0 +1,343 @@ + +/* DirectDraw Base Functions + * + * Copyright 1997-1999 Marcus Meissner + * Copyright 1998 Lionel Ulmer (most of Direct3D stuff) + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "gdi.h" +#include "heap.h" +#include "dc.h" +#include "win.h" +#include "wine/exception.h" +#include "ddraw.h" +#include "d3d.h" +#include "debugtools.h" +#include "spy.h" +#include "message.h" +#include "options.h" +#include "monitor.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +/****************************************************************************** + * debug output functions + */ +void _dump_DDBLTFX(DWORD flagmask) { + int i; + const struct { + DWORD mask; + char *name; + } flags[] = { +#define FE(x) { x, #x}, + FE(DDBLTFX_ARITHSTRETCHY) + FE(DDBLTFX_MIRRORLEFTRIGHT) + FE(DDBLTFX_MIRRORUPDOWN) + FE(DDBLTFX_NOTEARING) + FE(DDBLTFX_ROTATE180) + FE(DDBLTFX_ROTATE270) + FE(DDBLTFX_ROTATE90) + FE(DDBLTFX_ZBUFFERRANGE) + FE(DDBLTFX_ZBUFFERBASEDEST) +#undef FE + }; + for (i=0;idwFlags); + if (pf->dwFlags & DDPF_FOURCC) + DPRINTF(", dwFourCC : %ld", pf->dwFourCC); + if (pf->dwFlags & DDPF_RGB) { + char *cmd; + DPRINTF(", RGB bits: %ld, ", pf->u.dwRGBBitCount); + switch (pf->u.dwRGBBitCount) { + case 4: cmd = "%1lx"; break; + case 8: cmd = "%02lx"; break; + case 16: cmd = "%04lx"; break; + case 24: cmd = "%06lx"; break; + case 32: cmd = "%08lx"; break; + default: ERR("Unexpected bit depth !\n"); cmd = "%d"; break; + } + DPRINTF(" R "); DPRINTF(cmd, pf->u1.dwRBitMask); + DPRINTF(" G "); DPRINTF(cmd, pf->u2.dwGBitMask); + DPRINTF(" B "); DPRINTF(cmd, pf->u3.dwBBitMask); + if (pf->dwFlags & DDPF_ALPHAPIXELS) + DPRINTF(" A "); DPRINTF(cmd, pf->u4.dwRGBAlphaBitMask); + if (pf->dwFlags & DDPF_ZPIXELS) + DPRINTF(" Z "); DPRINTF(cmd, pf->u4.dwRGBZBitMask); + } + if (pf->dwFlags & DDPF_ZBUFFER) + DPRINTF(", Z bits : %ld", pf->u.dwZBufferBitDepth); + if (pf->dwFlags & DDPF_ALPHA) + DPRINTF(", Alpha bits : %ld", pf->u.dwAlphaBitDepth); + DPRINTF(")"); +} + +void _dump_colorkeyflag(DWORD ck) { + int i; + const struct { + DWORD mask; + char *name; + } flags[] = { +#define FE(x) { x, #x}, + FE(DDCKEY_COLORSPACE) + FE(DDCKEY_DESTBLT) + FE(DDCKEY_DESTOVERLAY) + FE(DDCKEY_SRCBLT) + FE(DDCKEY_SRCOVERLAY) +#undef FE + }; + for (i=0;idwColorSpaceLowValue, ddck->dwColorSpaceHighValue); +} + +void _dump_surface_desc(DDSURFACEDESC *lpddsd) { + int i; + struct { + DWORD mask; + char *name; + void (*func)(void *); + void *elt; + } flags[16], *fe = flags; +#define FE(x,f,e) do { fe->mask = x; fe->name = #x; fe->func = f; fe->elt = (void *) &(lpddsd->e); fe++; } while(0) + FE(DDSD_CAPS, _dump_DDSCAPS, ddsCaps); + FE(DDSD_HEIGHT, _dump_DWORD, dwHeight); + FE(DDSD_WIDTH, _dump_DWORD, dwWidth); + FE(DDSD_PITCH, _dump_DWORD, lPitch); + FE(DDSD_BACKBUFFERCOUNT, _dump_DWORD, dwBackBufferCount); + FE(DDSD_ZBUFFERBITDEPTH, _dump_DWORD, u.dwZBufferBitDepth); + FE(DDSD_ALPHABITDEPTH, _dump_DWORD, dwAlphaBitDepth); + FE(DDSD_PIXELFORMAT, _dump_pixelformat, ddpfPixelFormat); + FE(DDSD_CKDESTOVERLAY, _dump_DDCOLORKEY, ddckCKDestOverlay); + FE(DDSD_CKDESTBLT, _dump_DDCOLORKEY, ddckCKDestBlt); + FE(DDSD_CKSRCOVERLAY, _dump_DDCOLORKEY, ddckCKSrcOverlay); + FE(DDSD_CKSRCBLT, _dump_DDCOLORKEY, ddckCKSrcBlt); + FE(DDSD_MIPMAPCOUNT, _dump_DWORD, u.dwMipMapCount); + FE(DDSD_REFRESHRATE, _dump_DWORD, u.dwRefreshRate); + FE(DDSD_LINEARSIZE, _dump_DWORD, u1.dwLinearSize); + FE(DDSD_LPSURFACE, _dump_PTR, u1.lpSurface); +#undef FE + + for (i=0;idwFlags) { + DPRINTF(" - %s : ",flags[i].name); + flags[i].func(flags[i].elt); + DPRINTF("\n"); + } +} +void _dump_cooperativelevel(DWORD cooplevel) { + int i; + const struct { + int mask; + char *name; + } flags[] = { +#define FE(x) { x, #x}, + FE(DDSCL_FULLSCREEN) + FE(DDSCL_ALLOWREBOOT) + FE(DDSCL_NOWINDOWCHANGES) + FE(DDSCL_NORMAL) + FE(DDSCL_ALLOWMODEX) + FE(DDSCL_EXCLUSIVE) + FE(DDSCL_SETFOCUSWINDOW) + FE(DDSCL_SETDEVICEWINDOW) + FE(DDSCL_CREATEDEVICEWINDOW) +#undef FE + }; + + if (TRACE_ON(ddraw)) { + DPRINTF(" - "); + for (i=0;i +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "heap.h" +#include "dc.h" +#include "win.h" +#include "wine/exception.h" +#include "ddraw.h" +#include "d3d.h" +#include "debugtools.h" +#include "message.h" +#include "monitor.h" + +/* This for all the enumeration and creation of D3D-related objects */ +#include "ddraw_private.h" + +#define MAX_DDRAW_DRIVERS 3 +static ddraw_driver * ddraw_drivers[MAX_DDRAW_DRIVERS]; +static int nrof_ddraw_drivers = 0; + +DEFAULT_DEBUG_CHANNEL(ddraw); + +/* register a direct draw driver. We better not use malloc for we are in + * the ELF startup initialisation at this point. + */ +void ddraw_register_driver(ddraw_driver *driver) { + ddraw_drivers[nrof_ddraw_drivers++] = driver; + + /* increase MAX_DDRAW_DRIVERS if the line below triggers */ + assert(nrof_ddraw_drivers <= MAX_DDRAW_DRIVERS); +} + +/**********************************************************************/ + +typedef struct { + LPVOID lpCallback; + LPVOID lpContext; +} DirectDrawEnumerateProcData; + +/*********************************************************************** + * DirectDrawEnumerateExA (DDRAW.*) + */ +HRESULT WINAPI DirectDrawEnumerateExA( + LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) +{ + int i; + TRACE("(%p,%p, %08lx)\n", lpCallback, lpContext, dwFlags); + + if (TRACE_ON(ddraw)) { + DPRINTF(" Flags : "); + if (dwFlags & DDENUM_ATTACHEDSECONDARYDEVICES) + DPRINTF("DDENUM_ATTACHEDSECONDARYDEVICES "); + if (dwFlags & DDENUM_DETACHEDSECONDARYDEVICES) + DPRINTF("DDENUM_DETACHEDSECONDARYDEVICES "); + if (dwFlags & DDENUM_NONDISPLAYDEVICES) + DPRINTF("DDENUM_NONDISPLAYDEVICES "); + DPRINTF("\n"); + } + + if (dwFlags & DDENUM_NONDISPLAYDEVICES) { + FIXME("no non-display devices supported.\n"); + return DD_OK; + } +/* Hmm. Leave this out. + if (dwFlags & DDENUM_ATTACHEDSECONDARYDEVICES) { + FIXME("no attached secondary devices supported.\n"); + return DD_OK; + } + */ + if (dwFlags & DDENUM_DETACHEDSECONDARYDEVICES) { + FIXME("no detached secondary devices supported.\n"); + return DD_OK; + } + + for (i=0;icreateDDRAW(NULL)) /* !0 is failing */ + continue; + TRACE("Enumerating %s/%s interface\n",ddraw_drivers[i]->name,ddraw_drivers[i]->type); + if (!lpCallback( + ddraw_drivers[i]->guid, + (LPSTR)ddraw_drivers[i]->name, + (LPSTR)ddraw_drivers[i]->type, + lpContext, + 0 /* FIXME: flags not supported here */ + )) + return DD_OK; + } + if (nrof_ddraw_drivers) { + TRACE("Enumerating the default interface\n"); + if (!lpCallback(NULL,"WINE (default)", "display", lpContext, 0)) + return DD_OK; + } + return DD_OK; +} + +/*********************************************************************** + * DirectDrawEnumerateExW (DDRAW.*) + */ + +static BOOL CALLBACK DirectDrawEnumerateExProcW( + GUID *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, + LPVOID lpContext, HMONITOR hm) +{ + DirectDrawEnumerateProcData *pEPD = (DirectDrawEnumerateProcData*)lpContext; + LPWSTR lpDriverDescriptionW = + HEAP_strdupAtoW(GetProcessHeap(), 0, lpDriverDescription); + LPWSTR lpDriverNameW = + HEAP_strdupAtoW(GetProcessHeap(), 0, lpDriverName); + + BOOL bResult = (*(LPDDENUMCALLBACKEXW *) pEPD->lpCallback)( + lpGUID, lpDriverDescriptionW, lpDriverNameW, pEPD->lpContext, hm); + + HeapFree(GetProcessHeap(), 0, lpDriverDescriptionW); + HeapFree(GetProcessHeap(), 0, lpDriverNameW); + return bResult; +} + +/**********************************************************************/ + +HRESULT WINAPI DirectDrawEnumerateExW( + LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) +{ + DirectDrawEnumerateProcData epd; + epd.lpCallback = (LPVOID) lpCallback; + epd.lpContext = lpContext; + + return DirectDrawEnumerateExA(DirectDrawEnumerateExProcW, (LPVOID) &epd, 0); +} + +/*********************************************************************** + * DirectDrawEnumerateA (DDRAW.*) + */ + +static BOOL CALLBACK DirectDrawEnumerateProcA( + GUID *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, + LPVOID lpContext, HMONITOR hm) +{ + DirectDrawEnumerateProcData *pEPD = (DirectDrawEnumerateProcData*)lpContext; + + return ((LPDDENUMCALLBACKA) pEPD->lpCallback)( + lpGUID, lpDriverDescription, lpDriverName, pEPD->lpContext); +} + +/**********************************************************************/ + +HRESULT WINAPI DirectDrawEnumerateA( + LPDDENUMCALLBACKA lpCallback, LPVOID lpContext) +{ + DirectDrawEnumerateProcData epd; + epd.lpCallback = (LPVOID) lpCallback; + epd.lpContext = lpContext; + + return DirectDrawEnumerateExA(DirectDrawEnumerateProcA, (LPVOID) &epd, 0); +} + +/*********************************************************************** + * DirectDrawEnumerateW (DDRAW.*) + */ + +static BOOL WINAPI DirectDrawEnumerateProcW( + GUID *lpGUID, LPWSTR lpDriverDescription, LPWSTR lpDriverName, + LPVOID lpContext, HMONITOR hm) +{ + DirectDrawEnumerateProcData *pEPD = (DirectDrawEnumerateProcData*)lpContext; + + return ((LPDDENUMCALLBACKW) pEPD->lpCallback)( + lpGUID, lpDriverDescription, lpDriverName, pEPD->lpContext); +} + +/**********************************************************************/ + +HRESULT WINAPI DirectDrawEnumerateW( + LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) +{ + DirectDrawEnumerateProcData epd; + epd.lpCallback = (LPVOID) lpCallback; + epd.lpContext = lpContext; + + return DirectDrawEnumerateExW(DirectDrawEnumerateProcW, (LPVOID) &epd, 0); +} + +/****************************************************************************** + * DirectDraw Window Procedure + */ +static LRESULT WINAPI DDWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + LRESULT ret; + IDirectDrawImpl* ddraw = NULL; + DWORD lastError; + + /* FIXME(ddraw,"(0x%04x,%s,0x%08lx,0x%08lx),stub!\n",(int)hwnd,SPY_GetMsgName(msg),(long)wParam,(long)lParam); */ + + SetLastError( ERROR_SUCCESS ); + ddraw = (IDirectDrawImpl*)GetPropA( hwnd, ddProp ); + if( (!ddraw) && ( ( lastError = GetLastError() ) != ERROR_SUCCESS )) + ERR("Unable to retrieve this ptr from window. Error %08lx\n",lastError); + + if( ddraw ) { + /* Perform any special direct draw functions */ + if (msg==WM_PAINT) + ddraw->d.paintable = 1; + + /* Now let the application deal with the rest of this */ + if( ddraw->d.mainWindow ) { + + /* Don't think that we actually need to call this but... + * might as well be on the safe side of things... + */ + + /* I changed hwnd to ddraw->d.mainWindow as I did not see why + * it should be the procedures of our fake window that gets called + * instead of those of the window provided by the application. + * And with this patch, mouse clicks work with Monkey Island III + * - Lionel + */ + ret = DefWindowProcA( ddraw->d.mainWindow, msg, wParam, lParam ); + + if( !ret ) { + WND *tmpWnd =WIN_FindWndPtr(ddraw->d.mainWindow); + /* We didn't handle the message - give it to the application */ + if (ddraw && ddraw->d.mainWindow && tmpWnd) + ret = CallWindowProcA(tmpWnd->winproc, + ddraw->d.mainWindow, msg, wParam, lParam ); + WIN_ReleaseWndPtr(tmpWnd); + } + return ret; + } /* else FALLTHROUGH */ + } /* else FALLTHROUGH */ + return DefWindowProcA(hwnd,msg,wParam,lParam); +} + +HRESULT WINAPI DirectDrawCreate( + LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter +) { + IDirectDrawImpl** ilplpDD=(IDirectDrawImpl**)lplpDD; + WNDCLASSA wc; + HRESULT ret = 0; + int i,drvindex=0; + + struct ddraw_driver *ddd = NULL; + + if (!HIWORD(lpGUID)) lpGUID = NULL; + + TRACE("(%s,%p,%p)\n",debugstr_guid(lpGUID),ilplpDD,pUnkOuter); + + while (1) { + ddd = NULL; + if ( ( !lpGUID ) || + ( IsEqualGUID( &IID_IDirectDraw, lpGUID ) ) || + ( IsEqualGUID( &IID_IDirectDraw2, lpGUID ) ) || + ( IsEqualGUID( &IID_IDirectDraw4, lpGUID ) ) + ) { + /* choose an interface out of the list */ + for (i=0;ipreferencepreference)) { + drvindex = i; + ddd = xddd; + } + } + } else { + for (i=0;iguid,lpGUID)) { + drvindex = i; + ddd = ddraw_drivers[i]; + break; + } + } + } + if (!ddd) { + if (!nrof_ddraw_drivers) { + ERR("DirectDrawCreate(%s,%p,%p): no DirectDraw drivers compiled in.\n",debugstr_guid(lpGUID),lplpDD,pUnkOuter); + return DDERR_NODIRECTDRAWHW; + } + ERR("DirectDrawCreate(%s,%p,%p): did not recognize requested GUID.\n",debugstr_guid(lpGUID),lplpDD,pUnkOuter); + return DDERR_INVALIDDIRECTDRAWGUID; + } + TRACE("using \"%s\" driver, calling %p\n",ddd->name,ddd->createDDRAW); + + ret = ddd->createDDRAW(lplpDD); + if (!ret) + break; + ddraw_drivers[drvindex] = NULL; /* mark this one as unusable */ + } + wc.style = CS_GLOBALCLASS; + wc.lpfnWndProc = DDWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + + /* We can be a child of the desktop since we're really important */ + wc.hInstance= 0; + wc.hIcon = 0; + wc.hCursor = (HCURSOR)IDC_ARROWA; + wc.hbrBackground = NULL_BRUSH; + wc.lpszMenuName = 0; + wc.lpszClassName = "WINE_DirectDraw"; + (*ilplpDD)->d.winclass = RegisterClassA(&wc); + return ret; +} + +/******************************************************************************* + * DirectDraw ClassFactory + * + * Heavily inspired (well, can you say completely copied :-) ) from DirectSound + * + */ +typedef struct { + /* IUnknown fields */ + ICOM_VFIELD(IClassFactory); + DWORD ref; +} IClassFactoryImpl; + +static HRESULT WINAPI +DDCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { + ICOM_THIS(IClassFactoryImpl,iface); + + FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI +DDCF_AddRef(LPCLASSFACTORY iface) { + ICOM_THIS(IClassFactoryImpl,iface); + return ++(This->ref); +} + +static ULONG WINAPI DDCF_Release(LPCLASSFACTORY iface) { + ICOM_THIS(IClassFactoryImpl,iface); + /* static class, won't be freed */ + return --(This->ref); +} + +static HRESULT WINAPI DDCF_CreateInstance( + LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj +) { + ICOM_THIS(IClassFactoryImpl,iface); + + TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); + if ( ( IsEqualGUID( &IID_IDirectDraw, riid ) ) || + ( IsEqualGUID( &IID_IDirectDraw2, riid ) ) || + ( IsEqualGUID( &IID_IDirectDraw4, riid ) ) ) { + /* FIXME: reuse already created DirectDraw if present? */ + return DirectDrawCreate((LPGUID) riid,(LPDIRECTDRAW*)ppobj,pOuter); + } + return CLASS_E_CLASSNOTAVAILABLE; +} + +static HRESULT WINAPI DDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { + ICOM_THIS(IClassFactoryImpl,iface); + FIXME("(%p)->(%d),stub!\n",This,dolock); + return S_OK; +} + +static ICOM_VTABLE(IClassFactory) DDCF_Vtbl = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + DDCF_QueryInterface, + DDCF_AddRef, + DDCF_Release, + DDCF_CreateInstance, + DDCF_LockServer +}; +static IClassFactoryImpl DDRAW_CF = {&DDCF_Vtbl, 1 }; + +/******************************************************************************* + * DllGetClassObject [DDRAW.13] + * Retrieves class object from a DLL object + * + * NOTES + * Docs say returns STDAPI + * + * PARAMS + * rclsid [I] CLSID for the class object + * riid [I] Reference to identifier of interface for class object + * ppv [O] Address of variable to receive interface pointer for riid + * + * RETURNS + * Success: S_OK + * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG, + * E_UNEXPECTED + */ +DWORD WINAPI DDRAW_DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppv) +{ + TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + if ( IsEqualGUID( &IID_IClassFactory, riid ) ) { + *ppv = (LPVOID)&DDRAW_CF; + IClassFactory_AddRef((IClassFactory*)*ppv); + return S_OK; + } + FIXME("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + return CLASS_E_CLASSNOTAVAILABLE; +} + + +/******************************************************************************* + * DllCanUnloadNow [DDRAW.12] Determines whether the DLL is in use. + * + * RETURNS + * Success: S_OK + * Failure: S_FALSE + */ +DWORD WINAPI DDRAW_DllCanUnloadNow(void) { + FIXME("(void): stub\n"); + return S_FALSE; +} diff --git a/dlls/ddraw/mesa.c b/dlls/ddraw/mesa.c new file mode 100644 index 00000000000..aa8b78299b0 --- /dev/null +++ b/dlls/ddraw/mesa.c @@ -0,0 +1,252 @@ +/* Direct3D Common functions + (c) 1998 Lionel ULMER + + This file contains all MESA common code */ + +#include "windef.h" +#include "wine/obj_base.h" +#include "ddraw.h" +#include "d3d.h" +#include "debugtools.h" + +#include "mesa_private.h" + +DEFAULT_DEBUG_CHANNEL(ddraw) + +#define D3DTPRIVATE(x) mesa_d3dt_private *dtpriv = (mesa_d3dt_private*)(x)->private + +void set_render_state(D3DRENDERSTATETYPE dwRenderStateType, + DWORD dwRenderState, RenderState *rs) +{ + + if (TRACE_ON(ddraw)) + _dump_renderstate(dwRenderStateType, dwRenderState); + + /* First, all the stipple patterns */ + if ((dwRenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00) && + (dwRenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31)) { + ERR("Unhandled dwRenderStateType stipple %d!\n",dwRenderStateType); + } else { + ENTER_GL(); + + /* All others state variables */ + switch (dwRenderStateType) { + + case D3DRENDERSTATE_TEXTUREHANDLE: { /* 1 */ + IDirect3DTexture2Impl* tex = (IDirect3DTexture2Impl*) dwRenderState; + D3DTPRIVATE(tex); + + if (tex == NULL) { + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + } else { + TRACE("setting OpenGL texture handle : %d\n", dtpriv->tex_name); + glEnable(GL_TEXTURE_2D); + /* Default parameters */ + glBindTexture(GL_TEXTURE_2D, dtpriv->tex_name); + /* To prevent state change, we could test here what are the parameters + stored in the texture */ + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, rs->mag); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, rs->min); + } + } break; + + case D3DRENDERSTATE_TEXTUREPERSPECTIVE: /* 4 */ + if (dwRenderState) + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + else + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); + break; + + case D3DRENDERSTATE_ZENABLE: /* 7 */ + if (dwRenderState) + glEnable(GL_DEPTH_TEST); + else + glDisable(GL_DEPTH_TEST); + break; + + case D3DRENDERSTATE_FILLMODE: /* 8 */ + switch ((D3DFILLMODE) dwRenderState) { + case D3DFILL_SOLID: + break; + + default: + ERR("Unhandled fill mode !\n"); + } + break; + + case D3DRENDERSTATE_SHADEMODE: /* 9 */ + switch ((D3DSHADEMODE) dwRenderState) { + case D3DSHADE_FLAT: + glShadeModel(GL_FLAT); + break; + + case D3DSHADE_GOURAUD: + glShadeModel(GL_SMOOTH); + break; + + default: + ERR("Unhandled shade mode !\n"); + } + break; + + case D3DRENDERSTATE_ZWRITEENABLE: /* 14 */ + if (dwRenderState) + glDepthMask(GL_TRUE); + else + glDepthMask(GL_FALSE); + break; + + case D3DRENDERSTATE_TEXTUREMAG: /* 17 */ + switch ((D3DTEXTUREFILTER) dwRenderState) { + case D3DFILTER_NEAREST: + rs->mag = GL_NEAREST; + break; + + case D3DFILTER_LINEAR: + rs->mag = GL_LINEAR; + break; + + default: + ERR("Unhandled texture mag !\n"); + } + break; + + case D3DRENDERSTATE_TEXTUREMIN: /* 18 */ + switch ((D3DTEXTUREFILTER) dwRenderState) { + case D3DFILTER_NEAREST: + rs->min = GL_NEAREST; + break; + + case D3DFILTER_LINEAR: + rs->mag = GL_LINEAR; + break; + + default: + ERR("Unhandled texture min !\n"); + } + break; + + case D3DRENDERSTATE_SRCBLEND: /* 19 */ + switch ((D3DBLEND) dwRenderState) { + case D3DBLEND_SRCALPHA: + rs->src = GL_SRC_ALPHA; + break; + + default: + ERR("Unhandled blend mode !\n"); + } + + glBlendFunc(rs->src, rs->dst); + break; + + case D3DRENDERSTATE_DESTBLEND: /* 20 */ + switch ((D3DBLEND) dwRenderState) { + case D3DBLEND_INVSRCALPHA: + rs->dst = GL_ONE_MINUS_SRC_ALPHA; + break; + + default: + ERR("Unhandled blend mode !\n"); + } + + glBlendFunc(rs->src, rs->dst); + break; + + case D3DRENDERSTATE_TEXTUREMAPBLEND: /* 21 */ + switch ((D3DTEXTUREBLEND) dwRenderState) { + case D3DTBLEND_MODULATE: + case D3DTBLEND_MODULATEALPHA: + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + break; + + default: + ERR("Unhandled texture environment !\n"); + } + break; + + case D3DRENDERSTATE_CULLMODE: /* 22 */ + switch ((D3DCULL) dwRenderState) { + case D3DCULL_NONE: + glDisable(GL_CULL_FACE); + break; + + case D3DCULL_CW: + glEnable(GL_CULL_FACE); + glFrontFace(GL_CW); + break; + + case D3DCULL_CCW: + glEnable(GL_CULL_FACE); + glFrontFace(GL_CCW); + break; + + default: + ERR("Unhandled cull mode !\n"); + } + break; + + case D3DRENDERSTATE_ZFUNC: /* 23 */ + switch ((D3DCMPFUNC) dwRenderState) { + case D3DCMP_NEVER: + glDepthFunc(GL_NEVER); + break; + case D3DCMP_LESS: + glDepthFunc(GL_LESS); + break; + case D3DCMP_EQUAL: + glDepthFunc(GL_EQUAL); + break; + case D3DCMP_LESSEQUAL: + glDepthFunc(GL_LEQUAL); + break; + case D3DCMP_GREATER: + glDepthFunc(GL_GREATER); + break; + case D3DCMP_NOTEQUAL: + glDepthFunc(GL_NOTEQUAL); + break; + case D3DCMP_GREATEREQUAL: + glDepthFunc(GL_GEQUAL); + break; + case D3DCMP_ALWAYS: + glDepthFunc(GL_ALWAYS); + break; + + default: + ERR("Unexpected value\n"); + } + break; + + case D3DRENDERSTATE_DITHERENABLE: /* 26 */ + if (dwRenderState) + glEnable(GL_DITHER); + else + glDisable(GL_DITHER); + break; + + case D3DRENDERSTATE_ALPHABLENDENABLE: /* 27 */ + if (dwRenderState) + glEnable(GL_BLEND); + else + glDisable(GL_BLEND); + break; + + case D3DRENDERSTATE_COLORKEYENABLE: /* 41 */ + if (dwRenderState) + glEnable(GL_BLEND); + else + glDisable(GL_BLEND); + break; + + case D3DRENDERSTATE_FLUSHBATCH: /* 50 */ + break; + + default: + ERR("Unhandled dwRenderStateType %d!\n",dwRenderStateType); + break; + } + + LEAVE_GL(); + } +} diff --git a/dlls/ddraw/mesa_private.h b/dlls/ddraw/mesa_private.h new file mode 100644 index 00000000000..aa0fb8296b0 --- /dev/null +++ b/dlls/ddraw/mesa_private.h @@ -0,0 +1,159 @@ +/* MESA private include file + (c) 1998 Lionel ULMER + + This files contains all the structure that are not exported + through d3d.h and all common macros. */ + +#ifndef __GRAPHICS_WINE_MESA_PRIVATE_H +#define __GRAPHICS_WINE_MESA_PRIVATE_H + +#include "d3d_private.h" + +#include "wine_gl.h" +#include "x11drv.h" + +#undef USE_OSMESA + +#include "x11_private.h" + +/***************************************************************************** + * IDirect3DLight MESA private structure + */ +typedef struct mesa_d3dl_private +{ + GLenum light_num; +} mesa_d3dl_private; + +/***************************************************************************** + * IDirect3DTexture2 MESA private structure + */ +typedef struct mesa_d3dt_private +{ + GLuint tex_name; +} mesa_d3dt_private; + +/***************************************************************************** + * IDirect3DViewport2 implementation structure + */ +typedef struct mesa_d3dv_private +{ + GLenum nextlight; +} mesa_d3dv_private; + +#ifdef USE_OSMESA +# define LEAVE_GL() ; +# define ENTER_GL() ; +#else +# define LEAVE_GL() LeaveCriticalSection( &X11DRV_CritSection ) +# define ENTER_GL() EnterCriticalSection( &X11DRV_CritSection ) +#endif + +/* Matrix copy WITH transposition */ +#define conv_mat2(mat,gl_mat) \ +{ \ + TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ + TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ + TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ + TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \ + (gl_mat)[ 0] = (mat)->_11; \ + (gl_mat)[ 1] = (mat)->_21; \ + (gl_mat)[ 2] = (mat)->_31; \ + (gl_mat)[ 3] = (mat)->_41; \ + (gl_mat)[ 4] = (mat)->_12; \ + (gl_mat)[ 5] = (mat)->_22; \ + (gl_mat)[ 6] = (mat)->_32; \ + (gl_mat)[ 7] = (mat)->_42; \ + (gl_mat)[ 8] = (mat)->_13; \ + (gl_mat)[ 9] = (mat)->_23; \ + (gl_mat)[10] = (mat)->_33; \ + (gl_mat)[11] = (mat)->_43; \ + (gl_mat)[12] = (mat)->_14; \ + (gl_mat)[13] = (mat)->_24; \ + (gl_mat)[14] = (mat)->_34; \ + (gl_mat)[15] = (mat)->_44; \ +}; + +/* Matrix copy WITHOUT transposition */ +#define conv_mat(mat,gl_mat) \ +{ \ + TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \ + TRACE("%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \ + TRACE("%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \ + TRACE("%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \ + memcpy(gl_mat, (mat), 16 * sizeof(float)); \ +}; + +typedef struct render_state { + /* This is used for the device mode */ + GLenum src, dst; + /* This is used for textures */ + GLenum mag, min; +} RenderState; + +typedef struct mesa_d3dd_private { +#ifdef USE_OSMESA + OSMesaContext ctx; + unsigned char *buffer; +#else + GLXContext ctx; +#endif + + /* The current render state */ + RenderState rs; + + /* The last type of vertex drawn */ + D3DVERTEXTYPE vt; + + D3DMATRIX *world_mat; + D3DMATRIX *view_mat; + D3DMATRIX *proj_mat; +} mesa_d3dd_private; + +#define _dump_colorvalue(s,v) \ + TRACE(" " s " : %f %f %f %f\n", \ + (v).r.r, (v).g.g, (v).b.b, (v).a.a); + +/* Common functions defined in d3dcommon.c */ +void set_render_state(D3DRENDERSTATETYPE dwRenderStateType, + DWORD dwRenderState, RenderState *rs) ; + +/* All non-static functions 'exported' by various sub-objects */ +extern LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf); +extern LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf); + +extern LPDIRECT3DLIGHT d3dlight_create_dx3(IDirect3DImpl* d3d1); +extern LPDIRECT3DLIGHT d3dlight_create(IDirect3D2Impl* d3d2); + +extern LPDIRECT3DEXECUTEBUFFER d3dexecutebuffer_create(IDirect3DDeviceImpl* d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc); + +extern LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1); +extern LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2); + +extern LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1); +extern LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2); + +extern int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device); +extern int d3d_OpenGL_dx3(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ; +extern int d3d_OpenGL(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ; +extern int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d); + +extern LPDIRECT3DTEXTURE2 mesa_d3dtexture2_create(IDirectDrawSurface4Impl*); +extern LPDIRECT3DTEXTURE mesa_d3dtexture_create(IDirectDrawSurface4Impl*); + +static const WINE_UNUSED GUID IID_D3DDEVICE2_OpenGL = { + 0x39a0da38, + 0x7e57, + 0x11d2, + { 0x8b,0x7c,0x0e,0x4e,0xd8,0x3c,0x2b,0x3c } +}; + +static const WINE_UNUSED GUID IID_D3DDEVICE_OpenGL = { + 0x31416d44, + 0x86ae, + 0x11d2, + { 0x82,0x2d,0xa8,0xd5,0x31,0x87,0xca,0xfa } +}; + +extern ICOM_VTABLE(IDirect3D) mesa_d3dvt; +extern ICOM_VTABLE(IDirect3D2) mesa_d3d2vt; +#endif /* __GRAPHICS_WINE_MESA_PRIVATE_H */ diff --git a/dlls/ddraw/x11.c b/dlls/ddraw/x11.c new file mode 100644 index 00000000000..fd14a71829f --- /dev/null +++ b/dlls/ddraw/x11.c @@ -0,0 +1,116 @@ +/* DirectDraw using DGA or Xlib(XSHM) + * + * Copyright 1997-1999 Marcus Meissner + * Copyright 1998 Lionel Ulmer (most of Direct3D stuff) + */ +#include "config.h" + +#include +#include +#include +#include +#include + +#include "winerror.h" +#include "options.h" +#include "monitor.h" +#include "debugtools.h" +#include "ddraw.h" + +DEFAULT_DEBUG_CHANNEL(ddraw); + +#include "x11_private.h" + +#ifdef HAVE_LIBXXSHM +int XShmErrorFlag = 0; +#endif + +static inline BOOL get_option( const char *name, BOOL def ) { + return PROFILE_GetWineIniBool( "x11drv", name, def ); +} + +static BOOL +DDRAW_XSHM_Available(void) { +#ifdef HAVE_LIBXXSHM + if (get_option( "UseXShm", 1 )) { + if (TSXShmQueryExtension(display)) { + int major,minor; + Bool shpix; + + if (TSXShmQueryVersion(display, &major, &minor, &shpix)) + return TRUE; + } + } +#endif + return FALSE; +} + +static HRESULT X11_Create( LPDIRECTDRAW *lplpDD ) { + IDirectDrawImpl* ddraw; + int depth; + x11_dd_private *x11priv; + + if (lplpDD == NULL) /* Testing ... this driver works all the time */ + return DD_OK; + + *lplpDD = (LPDIRECTDRAW)HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(IDirectDrawImpl) + ); + ddraw = (IDirectDrawImpl*)*lplpDD; + ICOM_VTBL(ddraw)= &xlib_ddvt; + ddraw->ref = 1; + ddraw->private = HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(x11_dd_private) + ); + x11priv = (x11_dd_private*)ddraw->private; + + /* At DirectDraw creation, the depth is the default depth */ + depth = DefaultDepthOfScreen(X11DRV_GetXScreen()); + _common_depth_to_pixelformat(depth, + &(ddraw->d.directdraw_pixelformat), + &(ddraw->d.screen_pixelformat), + &(ddraw->d.pixmap_depth)); + ddraw->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor); + ddraw->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor); +#ifdef HAVE_LIBXXSHM + /* Test if XShm is available. */ + if ((x11priv->xshm_active = DDRAW_XSHM_Available())) { + x11priv->xshm_compl = 0; + TRACE("Using XShm extension.\n"); + } +#endif + return DD_OK; +} + +/* Where do these GUIDs come from? mkuuid. + * They exist solely to distinguish between the targets Wine support, + * and should be different than any other GUIDs in existence. + */ +static GUID X11_DirectDraw_GUID = { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */ + 0x1574a740, + 0xdc61, + 0x11d1, + {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79} +}; + +ddraw_driver x11_driver = { + &X11_DirectDraw_GUID, + "display", + "WINE X11 DirectDraw Driver", + 50, + X11_Create +}; + +#ifdef __GNUC__ +static void X11_register(void) __attribute__((constructor)); +#else /* defined(__GNUC__) */ +static void __asm__dummy_dll_init(void) { + asm("\t.section .init ,\"ax\"\n" + "\tcall X11_register\n" + "\t.previous\n"); +#endif /* defined(__GNUC__) */ +static void X11_register(void) { ddraw_register_driver(&x11_driver); } diff --git a/dlls/ddraw/x11_private.h b/dlls/ddraw/x11_private.h new file mode 100644 index 00000000000..c3093e63946 --- /dev/null +++ b/dlls/ddraw/x11_private.h @@ -0,0 +1,58 @@ +#ifndef __WINE_DDRAW_X11_PRIVATE_H +#define __WINE_DDRAW_X11_PRIVATE_H + +/* This file contains all X11 private and specific definitions. + * It may also be used by all ports that reuse X11 stuff (like XF86 DGA) + */ +#include "ts_xlib.h" +#include "ts_xutil.h" + +#ifdef HAVE_LIBXXSHM +# include +# ifdef HAVE_SYS_IPC_H +# include +# endif +# ifdef HAVE_SYS_SHM_H +# include +# endif +# include "ts_xshm.h" +#endif /* defined(HAVE_LIBXXSHM) */ + +#include "x11drv.h" + +#include "ddraw_private.h" + +#include "wine_gl.h" + +extern ICOM_VTABLE(IDirectDraw) xlib_ddvt; +extern ICOM_VTABLE(IDirectDraw2) xlib_dd2vt; +extern ICOM_VTABLE(IDirectDraw4) xlib_dd4vt; +extern ICOM_VTABLE(IDirectDrawPalette) xlib_ddpalvt; +extern ICOM_VTABLE(IDirectDrawSurface4) xlib_dds4vt; + +typedef struct x11_dd_private { +#ifdef HAVE_LIBXXSHM + int xshm_active, xshm_compl; +#endif /* defined(HAVE_LIBXXSHM) */ + Window drawable; +} x11_dd_private; + +typedef struct x11_dp_private { + BOOL installed; /* is colormap installed */ + Colormap cm; /* the X11 Colormap associated */ +} x11_dp_private; + +extern HRESULT WINAPI Xlib_IDirectDrawPaletteImpl_SetEntries(LPDIRECTDRAWPALETTE,DWORD,DWORD,DWORD,LPPALETTEENTRY); +extern ULONG WINAPI Xlib_IDirectDrawPaletteImpl_Release(LPDIRECTDRAWPALETTE iface); + +typedef struct x11_ds_private { + XImage *image; +#ifdef HAVE_LIBXXSHM + XShmSegmentInfo shminfo; +#endif +} x11_ds_private; + +#ifdef HAVE_LIBXXSHM +extern int XShmErrorFlag; +#endif +#endif /* __WINE_DDRAW_X11_PRIVATE_H */