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