13bfa90b6Smrg/* 23bfa90b6Smrg * Copyright 2011 VMWare, Inc. 33bfa90b6Smrg * All Rights Reserved. 43bfa90b6Smrg * 53bfa90b6Smrg * Permission is hereby granted, free of charge, to any person obtaining a 63bfa90b6Smrg * copy of this software and associated documentation files (the 73bfa90b6Smrg * "Software"), to deal in the Software without restriction, including 83bfa90b6Smrg * without limitation the rights to use, copy, modify, merge, publish, 93bfa90b6Smrg * distribute, sub license, and/or sell copies of the Software, and to 103bfa90b6Smrg * permit persons to whom the Software is furnished to do so, subject to 113bfa90b6Smrg * the following conditions: 123bfa90b6Smrg * 133bfa90b6Smrg * The above copyright notice and this permission notice (including the 143bfa90b6Smrg * next paragraph) shall be included in all copies or substantial portions 153bfa90b6Smrg * of the Software. 163bfa90b6Smrg * 173bfa90b6Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 183bfa90b6Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 193bfa90b6Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 203bfa90b6Smrg * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 213bfa90b6Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 223bfa90b6Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 233bfa90b6Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 243bfa90b6Smrg * 253bfa90b6Smrg * Author: Thomas Hellstrom <thellstrom@vmware.com> 263bfa90b6Smrg */ 273bfa90b6Smrg#ifdef _HAVE_CONFIG_H_ 283bfa90b6Smrg#include "config.h" 293bfa90b6Smrg#endif 303bfa90b6Smrg 313bfa90b6Smrg#include <xorg-server.h> 323bfa90b6Smrg#include "vmwgfx_saa_priv.h" 333bfa90b6Smrg 343bfa90b6Smrg 353bfa90b6Smrgstatic const enum xa_surface_type vmwgfx_stype_map[] = { 363bfa90b6Smrg [PICT_TYPE_OTHER] = xa_type_other, 373bfa90b6Smrg [PICT_TYPE_A] = xa_type_a, 383bfa90b6Smrg [PICT_TYPE_ARGB] = xa_type_argb, 393bfa90b6Smrg [PICT_TYPE_ABGR] = xa_type_abgr, 403bfa90b6Smrg [PICT_TYPE_BGRA] = xa_type_bgra 413bfa90b6Smrg}; 423bfa90b6Smrg 433bfa90b6Smrgstatic const unsigned int vmwgfx_stype_map_size = 443bfa90b6Smrg sizeof(vmwgfx_stype_map) / sizeof(enum xa_surface_type); 453bfa90b6Smrg 46591e32d7Ssnj/** 47591e32d7Ssnj * vmwgfx_xa_surface_redefine - wrapper around xa_surface_redefine 48591e32d7Ssnj * 49591e32d7Ssnj * @vpix: Pointer to the struct vmwgfx_saa_pixmap the surface is attached to. 50591e32d7Ssnj * @srf: The surface. 51591e32d7Ssnj * @width: New width. 52591e32d7Ssnj * @height: New height. 53591e32d7Ssnj * @depth: New pixel depth. 54591e32d7Ssnj * @stype: New surface type. 55591e32d7Ssnj * @rgb_format: New rgb format. 56591e32d7Ssnj * @new_flags: New surface flags. 57591e32d7Ssnj * @copy_contents: Copy contents if new backing store is allocated. 58591e32d7Ssnj * 59591e32d7Ssnj * This is a wrapper that prints out an error message if the backing store 60591e32d7Ssnj * of an active scanout surface is changed. 61591e32d7Ssnj */ 62591e32d7SsnjBool 63591e32d7Ssnjvmwgfx_xa_surface_redefine(struct vmwgfx_saa_pixmap *vpix, 64591e32d7Ssnj struct xa_surface *srf, 65591e32d7Ssnj int width, 66591e32d7Ssnj int height, 67591e32d7Ssnj int depth, 68591e32d7Ssnj enum xa_surface_type stype, 69591e32d7Ssnj enum xa_formats rgb_format, 70591e32d7Ssnj unsigned int new_flags, 71591e32d7Ssnj int copy_contents) 72591e32d7Ssnj{ 73591e32d7Ssnj uint32_t handle, new_handle, dummy; 74591e32d7Ssnj Bool have_handle = FALSE; 75591e32d7Ssnj 76591e32d7Ssnj if (!WSBMLISTEMPTY(&vpix->scanout_list)) 77591e32d7Ssnj have_handle = (_xa_surface_handle(srf, &handle, &dummy) == XA_ERR_NONE); 78591e32d7Ssnj 79591e32d7Ssnj if (xa_surface_redefine(srf, width, height, depth, stype, rgb_format, 80591e32d7Ssnj new_flags, copy_contents) != XA_ERR_NONE) 81591e32d7Ssnj return FALSE; 82591e32d7Ssnj 83591e32d7Ssnj if (!WSBMLISTEMPTY(&vpix->scanout_list) && have_handle && 84591e32d7Ssnj _xa_surface_handle(srf, &new_handle, &dummy) == XA_ERR_NONE && 85591e32d7Ssnj new_handle != handle) { 86591e32d7Ssnj LogMessage(X_ERROR, "Changed active scanout surface handle.\n"); 87591e32d7Ssnj } 88591e32d7Ssnj 89591e32d7Ssnj return TRUE; 90591e32d7Ssnj} 91591e32d7Ssnj 923bfa90b6Smrg 933bfa90b6Smrg/* 943bfa90b6Smrg * Create an xa format from a PICT format. 953bfa90b6Smrg */ 963bfa90b6Smrgenum xa_formats 973bfa90b6Smrgvmwgfx_xa_format(enum _PictFormatShort format) 983bfa90b6Smrg{ 993bfa90b6Smrg uint32_t ptype = PICT_FORMAT_TYPE(format); 1003bfa90b6Smrg 1013bfa90b6Smrg if (ptype >= vmwgfx_stype_map_size || 1023bfa90b6Smrg vmwgfx_stype_map[ptype] == 0 || 1033bfa90b6Smrg vmwgfx_stype_map[ptype] == xa_type_other) 1043bfa90b6Smrg return xa_format_unknown; 1053bfa90b6Smrg 1063bfa90b6Smrg return xa_format(PICT_FORMAT_BPP(format), 1073bfa90b6Smrg vmwgfx_stype_map[ptype], 1083bfa90b6Smrg PICT_FORMAT_A(format), 1093bfa90b6Smrg PICT_FORMAT_R(format), 1103bfa90b6Smrg PICT_FORMAT_G(format), 1113bfa90b6Smrg PICT_FORMAT_B(format)); 1123bfa90b6Smrg} 1133bfa90b6Smrg 1143bfa90b6Smrg/* 1153bfa90b6Smrg * Choose formats and flags for a dri2 surface. 1163bfa90b6Smrg */ 11725dbecb6SmrgBool 1183bfa90b6Smrgvmwgfx_hw_dri2_stage(PixmapPtr pixmap, unsigned int depth) 1193bfa90b6Smrg{ 1203bfa90b6Smrg struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap); 1213bfa90b6Smrg enum xa_formats format; 1223bfa90b6Smrg 1233bfa90b6Smrg if (depth == 0) 1243bfa90b6Smrg depth = pixmap->drawable.depth; 1253bfa90b6Smrg 1263bfa90b6Smrg switch(depth) { 1273bfa90b6Smrg case 32: 1283bfa90b6Smrg format = xa_format_a8r8g8b8; 1293bfa90b6Smrg break; 1303bfa90b6Smrg case 24: 1313bfa90b6Smrg format = xa_format_x8r8g8b8; 1323bfa90b6Smrg break; 1333bfa90b6Smrg case 16: 1343bfa90b6Smrg format = xa_format_r5g6b5; 1353bfa90b6Smrg break; 1363bfa90b6Smrg case 15: 1373bfa90b6Smrg format = xa_format_x1r5g5b5; 1383bfa90b6Smrg break; 1393bfa90b6Smrg default: 1403bfa90b6Smrg return FALSE; 1413bfa90b6Smrg } 1423bfa90b6Smrg 1433bfa90b6Smrg vpix->staging_format = format; 1443bfa90b6Smrg vpix->staging_remove_flags = 0; 1453bfa90b6Smrg vpix->staging_add_flags = XA_FLAG_RENDER_TARGET | XA_FLAG_SHARED; 1463bfa90b6Smrg 1473bfa90b6Smrg return TRUE; 1483bfa90b6Smrg} 1493bfa90b6Smrg 1503bfa90b6Smrg/* 1513bfa90b6Smrg * Is composite old format compatible? Only difference is that old format 1523bfa90b6Smrg * has more alpha bits? 1533bfa90b6Smrg */ 1543bfa90b6Smrgstatic inline Bool 1553bfa90b6Smrgvmwgfx_old_format_compatible(enum xa_formats format, 1563bfa90b6Smrg enum xa_formats old_format) 1573bfa90b6Smrg{ 1583bfa90b6Smrg return (format == old_format || 1593bfa90b6Smrg (xa_format_type(format) == xa_format_type(old_format) && 1603bfa90b6Smrg xa_format_a(format) <= xa_format_a(old_format) && 1613bfa90b6Smrg xa_format_r(format) == xa_format_r(old_format) && 1623bfa90b6Smrg xa_format_g(format) == xa_format_g(old_format) && 1633bfa90b6Smrg xa_format_b(format) == xa_format_b(old_format))); 1643bfa90b6Smrg} 1653bfa90b6Smrg 1663bfa90b6Smrg 1673bfa90b6Smrg/* 1683bfa90b6Smrg * Choose format and flags for a composite dst surface. 1693bfa90b6Smrg */ 1703bfa90b6SmrgBool 1713bfa90b6Smrgvmwgfx_hw_composite_dst_stage(PixmapPtr pixmap, 1723bfa90b6Smrg enum _PictFormatShort pict_format) 1733bfa90b6Smrg{ 1743bfa90b6Smrg struct vmwgfx_saa *vsaa = 1753bfa90b6Smrg to_vmwgfx_saa(saa_get_driver(pixmap->drawable.pScreen)); 1763bfa90b6Smrg struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap); 1773bfa90b6Smrg enum xa_formats format = vmwgfx_xa_format(pict_format); 1783bfa90b6Smrg 1793bfa90b6Smrg /* 1803bfa90b6Smrg * Check if we can reuse old hardware format. 1813bfa90b6Smrg */ 1823bfa90b6Smrg if (vpix->hw) { 1833bfa90b6Smrg enum xa_formats old_format = xa_surface_format(vpix->hw); 1843bfa90b6Smrg 1853bfa90b6Smrg if (vmwgfx_old_format_compatible(format, old_format)) 1863bfa90b6Smrg format = old_format; 1873bfa90b6Smrg } 1883bfa90b6Smrg 1893bfa90b6Smrg if (xa_format_check_supported(vsaa->xat, format, 1903bfa90b6Smrg vpix->xa_flags | XA_FLAG_RENDER_TARGET) != 1913bfa90b6Smrg XA_ERR_NONE) { 1923bfa90b6Smrg return FALSE; 1933bfa90b6Smrg } 1943bfa90b6Smrg 1953bfa90b6Smrg vpix->staging_format = format; 1963bfa90b6Smrg vpix->staging_remove_flags = 0; 1973bfa90b6Smrg vpix->staging_add_flags = XA_FLAG_RENDER_TARGET | XA_FLAG_SHARED; 1983bfa90b6Smrg 1993bfa90b6Smrg return TRUE; 2003bfa90b6Smrg} 2013bfa90b6Smrg 2023bfa90b6Smrg/* 2033bfa90b6Smrg * Choose format and flags for a composite src surface. 2043bfa90b6Smrg */ 2053bfa90b6SmrgBool 2063bfa90b6Smrgvmwgfx_hw_composite_src_stage(PixmapPtr pixmap, 2073bfa90b6Smrg enum _PictFormatShort pict_format) 2083bfa90b6Smrg{ 2093bfa90b6Smrg struct vmwgfx_saa *vsaa = 2103bfa90b6Smrg to_vmwgfx_saa(saa_get_driver(pixmap->drawable.pScreen)); 2113bfa90b6Smrg struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap); 2123bfa90b6Smrg enum xa_formats format = vmwgfx_xa_format(pict_format); 2133bfa90b6Smrg enum xa_formats swizzle_format = xa_format_unknown; 2143bfa90b6Smrg enum xa_surface_type ftype; 2153bfa90b6Smrg 2163bfa90b6Smrg if (format == xa_format_unknown) 2173bfa90b6Smrg return FALSE; 2183bfa90b6Smrg 2193bfa90b6Smrg ftype = xa_format_type(format); 2203bfa90b6Smrg if (ftype == xa_type_abgr) { 2213bfa90b6Smrg 2223bfa90b6Smrg swizzle_format = xa_format(xa_format_bpp(format), 2233bfa90b6Smrg xa_type_argb, 2243bfa90b6Smrg xa_format_a(format), 2253bfa90b6Smrg xa_format_r(format), 2263bfa90b6Smrg xa_format_g(format), 2273bfa90b6Smrg xa_format_b(format)); 2283bfa90b6Smrg } 2293bfa90b6Smrg 2303bfa90b6Smrg /* 2313bfa90b6Smrg * Check if we can reuse old format. 2323bfa90b6Smrg */ 2333bfa90b6Smrg 2343bfa90b6Smrg if (vpix->hw) { 2353bfa90b6Smrg enum xa_formats old_format = xa_surface_format(vpix->hw); 2363bfa90b6Smrg 2373bfa90b6Smrg if (vmwgfx_old_format_compatible(format, old_format) || 2383bfa90b6Smrg (swizzle_format != xa_format_unknown && 2393bfa90b6Smrg vmwgfx_old_format_compatible(swizzle_format, old_format))) { 2403bfa90b6Smrg format = old_format; 2413bfa90b6Smrg goto have_format; 2423bfa90b6Smrg } 2433bfa90b6Smrg } 2443bfa90b6Smrg 2453bfa90b6Smrg if (swizzle_format != xa_format_unknown && 2463bfa90b6Smrg xa_format_check_supported(vsaa->xat, swizzle_format, vpix->xa_flags) == 2473bfa90b6Smrg XA_ERR_NONE) { 2483bfa90b6Smrg format = swizzle_format; 2493bfa90b6Smrg goto have_format; 2503bfa90b6Smrg } 2513bfa90b6Smrg 2523bfa90b6Smrg if (xa_format_check_supported(vsaa->xat, format, vpix->xa_flags) == 2533bfa90b6Smrg XA_ERR_NONE) { 2543bfa90b6Smrg goto have_format; 2553bfa90b6Smrg } 2563bfa90b6Smrg 2573bfa90b6Smrg return FALSE; 2583bfa90b6Smrg have_format: 2593bfa90b6Smrg vpix->staging_format = format; 2603bfa90b6Smrg vpix->staging_remove_flags = 0; 2613bfa90b6Smrg vpix->staging_add_flags = 0; 2623bfa90b6Smrg 2633bfa90b6Smrg return TRUE; 2643bfa90b6Smrg} 2653bfa90b6Smrg 2663bfa90b6Smrg/* 2673bfa90b6Smrg * Choose accel format given depth. 2683bfa90b6Smrg */ 2693bfa90b6Smrgstatic enum xa_formats 2703bfa90b6Smrgvmwgfx_choose_accel_format(unsigned int depth) 2713bfa90b6Smrg{ 2723bfa90b6Smrg switch(depth) { 2733bfa90b6Smrg case 32: 2743bfa90b6Smrg return xa_format_a8r8g8b8; 2753bfa90b6Smrg case 24: 2763bfa90b6Smrg return xa_format_x8r8g8b8; 2773bfa90b6Smrg case 16: 2783bfa90b6Smrg return xa_format_r5g6b5; 2793bfa90b6Smrg case 15: 2803bfa90b6Smrg return xa_format_x1r5g5b5; 2813bfa90b6Smrg case 8: 2823bfa90b6Smrg return xa_format_a8; 2833bfa90b6Smrg default: 2843bfa90b6Smrg break; 2853bfa90b6Smrg } 2863bfa90b6Smrg return xa_format_unknown; 2873bfa90b6Smrg} 2883bfa90b6Smrg 2893bfa90b6Smrg 2903bfa90b6Smrg/* 2913bfa90b6Smrg * Determine xa format and flags for an ordinary accel surface. 2923bfa90b6Smrg */ 2933bfa90b6SmrgBool 2943bfa90b6Smrgvmwgfx_hw_accel_stage(PixmapPtr pixmap, unsigned int depth, 2953bfa90b6Smrg uint32_t add_flags, uint32_t remove_flags) 2963bfa90b6Smrg{ 2973bfa90b6Smrg struct vmwgfx_saa_pixmap *vpix = vmwgfx_saa_pixmap(pixmap); 2983bfa90b6Smrg enum xa_formats format = xa_format_unknown; 2993bfa90b6Smrg 3003bfa90b6Smrg if (depth == 0) 3013bfa90b6Smrg depth = pixmap->drawable.depth; 3023bfa90b6Smrg 3033bfa90b6Smrg if (vpix->hw) { 3043bfa90b6Smrg enum xa_formats old_format = xa_surface_format(vpix->hw); 3053bfa90b6Smrg enum xa_surface_type ftype = xa_format_type(old_format); 3063bfa90b6Smrg 3073bfa90b6Smrg if (ftype != xa_type_argb && 3083bfa90b6Smrg ftype != xa_type_a) { 3093bfa90b6Smrg LogMessage(X_ERROR, 3103bfa90b6Smrg "Acceleration fallback due to strange hw format.\n"); 3113bfa90b6Smrg return FALSE; 3123bfa90b6Smrg } 3133bfa90b6Smrg 3143bfa90b6Smrg if (xa_format_depth(old_format) == depth || 3153bfa90b6Smrg (xa_format_depth(old_format) == 32 && 3163bfa90b6Smrg depth == 24)) 3173bfa90b6Smrg format = old_format; 3183bfa90b6Smrg } 3193bfa90b6Smrg 3203bfa90b6Smrg if (format == xa_format_unknown) 3213bfa90b6Smrg format = vmwgfx_choose_accel_format(depth); 3223bfa90b6Smrg 3233bfa90b6Smrg if (format == xa_format_unknown) 3243bfa90b6Smrg return FALSE; 3253bfa90b6Smrg 3263bfa90b6Smrg vpix->staging_add_flags = add_flags; 3273bfa90b6Smrg vpix->staging_remove_flags = remove_flags; 3283bfa90b6Smrg vpix->staging_format = format; 3293bfa90b6Smrg 3303bfa90b6Smrg return TRUE; 3313bfa90b6Smrg} 3323bfa90b6Smrg 3333bfa90b6Smrg/* 3343bfa90b6Smrg * Create a surface with a format and flags determined by one of 3353bfa90b6Smrg * the staging functions. 3363bfa90b6Smrg */ 3373bfa90b6SmrgBool 3383bfa90b6Smrgvmwgfx_hw_commit(PixmapPtr pixmap) 3393bfa90b6Smrg{ 3403bfa90b6Smrg struct vmwgfx_saa *vsaa = 3413bfa90b6Smrg to_vmwgfx_saa(saa_get_driver(pixmap->drawable.pScreen)); 3423bfa90b6Smrg struct saa_pixmap *spix = saa_get_saa_pixmap(pixmap); 3433bfa90b6Smrg struct vmwgfx_saa_pixmap *vpix = to_vmwgfx_saa_pixmap(spix); 3443bfa90b6Smrg enum xa_formats format = vpix->staging_format; 3453bfa90b6Smrg 3463bfa90b6Smrg if (vpix->hw) { 3473bfa90b6Smrg enum xa_formats old_format = xa_surface_format(vpix->hw); 3483bfa90b6Smrg 3493bfa90b6Smrg if (vpix->staging_format != old_format) { 3503bfa90b6Smrg if (xa_format_type(format) != xa_format_type(old_format) || 3513bfa90b6Smrg xa_format_r(format) != xa_format_r(old_format) || 3523bfa90b6Smrg xa_format_g(format) != xa_format_g(old_format) || 3533bfa90b6Smrg xa_format_b(format) != xa_format_b(old_format)) { 3543bfa90b6Smrg 3553bfa90b6Smrg LogMessage(X_INFO, "Killing old hw surface.\n"); 3563bfa90b6Smrg 3573bfa90b6Smrg if (!vmwgfx_hw_kill(vsaa, spix)) 3583bfa90b6Smrg return FALSE; 3593bfa90b6Smrg } 3603bfa90b6Smrg } 3613bfa90b6Smrg } 3623bfa90b6Smrg 3633bfa90b6Smrg if (vpix->hw) { 3643bfa90b6Smrg uint32_t new_flags; 3653bfa90b6Smrg 3663bfa90b6Smrg new_flags = (vpix->xa_flags & ~vpix->staging_remove_flags) | 36722f7e8e5Smrg vpix->staging_add_flags | XA_FLAG_SHARED; 3683bfa90b6Smrg 3693bfa90b6Smrg if (vpix->staging_format != xa_surface_format(vpix->hw)) 3703bfa90b6Smrg LogMessage(X_INFO, "Changing hardware format.\n"); 3713bfa90b6Smrg 372591e32d7Ssnj if (!vmwgfx_xa_surface_redefine(vpix, 373591e32d7Ssnj vpix->hw, 374591e32d7Ssnj pixmap->drawable.width, 375591e32d7Ssnj pixmap->drawable.height, 376591e32d7Ssnj 0, 377591e32d7Ssnj xa_type_other, 378591e32d7Ssnj vpix->staging_format, 379591e32d7Ssnj new_flags, 1) != XA_ERR_NONE) 3803bfa90b6Smrg return FALSE; 3813bfa90b6Smrg vpix->xa_flags = new_flags; 38225dbecb6Smrg } else if (!vmwgfx_create_hw(vsaa, pixmap, FALSE)) 3833bfa90b6Smrg return FALSE; 3843bfa90b6Smrg 3853bfa90b6Smrg return TRUE; 3863bfa90b6Smrg} 3873bfa90b6Smrg 3883bfa90b6Smrg/* 3893bfa90b6Smrg * Create an accel surface if there is none, and make sure the region 3903bfa90b6Smrg * given by @region is valid. If @region is NULL, the whole surface 3913bfa90b6Smrg * will be valid. This is a utility convenience function only. 3923bfa90b6Smrg */ 3933bfa90b6SmrgBool 3943bfa90b6Smrgvmwgfx_hw_accel_validate(PixmapPtr pixmap, unsigned int depth, 3953bfa90b6Smrg uint32_t add_flags, uint32_t remove_flags, 3963bfa90b6Smrg RegionPtr region) 3973bfa90b6Smrg{ 3983bfa90b6Smrg return (vmwgfx_hw_accel_stage(pixmap, depth, add_flags, remove_flags) && 3993bfa90b6Smrg vmwgfx_hw_commit(pixmap) && 4003bfa90b6Smrg vmwgfx_hw_validate(pixmap, region)); 4013bfa90b6Smrg} 4023bfa90b6Smrg 4033bfa90b6Smrg 4043bfa90b6Smrg/* 4053bfa90b6Smrg * Create a dri2 surface if there is none, 4063bfa90b6Smrg * and make sure the whole surfade is valid. 4073bfa90b6Smrg * This is a utility convenience function only. 4083bfa90b6Smrg */ 4093bfa90b6SmrgBool 4103bfa90b6Smrgvmwgfx_hw_dri2_validate(PixmapPtr pixmap, unsigned int depth) 4113bfa90b6Smrg{ 41222f7e8e5Smrg struct vmwgfx_saa *vsaa = 41322f7e8e5Smrg to_vmwgfx_saa(saa_get_driver(pixmap->drawable.pScreen)); 41422f7e8e5Smrg 41522f7e8e5Smrg if (!vsaa->is_master) 41622f7e8e5Smrg return FALSE; 41722f7e8e5Smrg 4183bfa90b6Smrg return (vmwgfx_hw_dri2_stage(pixmap, depth) && 4193bfa90b6Smrg vmwgfx_hw_commit(pixmap) && 4203bfa90b6Smrg vmwgfx_hw_validate(pixmap, NULL)); 4213bfa90b6Smrg} 422