11d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz/**************************************************************************
21d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz *
31d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * Copyright 2009, VMware, Inc.
41d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * All Rights Reserved.
51d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz *
61d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a
71d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * copy of this software and associated documentation files (the
81d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * "Software"), to deal in the Software without restriction, including
91d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * without limitation the rights to use, copy, modify, merge, publish,
101d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * distribute, sub license, and/or sell copies of the Software, and to
111d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * permit persons to whom the Software is furnished to do so, subject to
121d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * the following conditions:
131d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz *
141d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * The above copyright notice and this permission notice (including the
151d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * next paragraph) shall be included in all copies or substantial portions
161d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * of the Software.
171d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz *
181d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
191d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
201d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
211d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
221d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
231d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
241d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
251d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz *
261d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz **************************************************************************/
271d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz/*
281d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * Author: Keith Whitwell <keithw@vmware.com>
291d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * Author: Jakob Bornecrantz <wallbraker@gmail.com>
301d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz */
311d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
321d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz#include "dri_screen.h"
33c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis#include "dri_context.h"
341d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz#include "dri_drawable.h"
351d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
36903b90926c7aebb7f48f3c0fdbe90cd22dd5b662Chia-I Wu#include "pipe/p_screen.h"
376df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol#include "util/u_format.h"
381d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz#include "util/u_memory.h"
391372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz#include "util/u_inlines.h"
4023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
4123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic void
4223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromswap_fences_unref(struct dri_drawable *draw);
431372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
441372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzstatic boolean
451372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
461372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz                            const enum st_attachment_type *statts,
471372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz                            unsigned count,
481372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz                            struct pipe_resource **out)
491372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{
501372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   struct dri_drawable *drawable =
511372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      (struct dri_drawable *) stfbi->st_manager_private;
521372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   struct dri_screen *screen = dri_screen(drawable->sPriv);
531372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   unsigned statt_mask, new_mask;
541372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   boolean new_stamp;
551372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   int i;
560fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala   unsigned int lastStamp;
571372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
581372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   statt_mask = 0x0;
591372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < count; i++)
601372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      statt_mask |= (1 << statts[i]);
611372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
621372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* record newly allocated textures */
631372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   new_mask = (statt_mask & ~drawable->texture_mask);
641372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
651372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /*
66e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg    * dPriv->dri2.stamp is the server stamp.  dPriv->lastStamp is the
67e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg    * client stamp.  It has the value of the server stamp when last
68e9beaf65fdaf82a7845cbe176f353ddb6b8466c7Kristian Høgsberg    * checked.
691372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz    */
700fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala   do {
710fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala      lastStamp = drawable->dPriv->lastStamp;
720fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala      new_stamp = (drawable->texture_stamp != lastStamp);
731372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
740fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala      if (new_stamp || new_mask || screen->broken_invalidate) {
750fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala         if (new_stamp && drawable->update_drawable_info)
760fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala            drawable->update_drawable_info(drawable);
771372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
780fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala         drawable->allocate_textures(drawable, statts, count);
791372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
800fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala         /* add existing textures */
810fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala         for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
820fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala            if (drawable->textures[i])
830fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala               statt_mask |= (1 << i);
840fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala         }
851372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
860fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala         drawable->texture_stamp = lastStamp;
870fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala         drawable->texture_mask = statt_mask;
880fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala      }
890fcc518964223d9baaa2b45e80afeb800beb872fVille Syrjala   } while (lastStamp != drawable->dPriv->lastStamp);
901372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
911372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   if (!out)
921372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      return TRUE;
931372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
941372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < count; i++) {
951372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      out[i] = NULL;
961372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      pipe_resource_reference(&out[i], drawable->textures[statts[i]]);
971372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   }
981372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
991372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   return TRUE;
1001372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz}
1011372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1021372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzstatic boolean
1031372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
1041372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz                               enum st_attachment_type statt)
1051372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{
1061372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   struct dri_drawable *drawable =
1071372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      (struct dri_drawable *) stfbi->st_manager_private;
1081372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1091372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* XXX remove this and just set the correct one on the framebuffer */
110873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis   drawable->flush_frontbuffer(drawable, statt);
1111372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1121372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   return TRUE;
1131372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz}
1141372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
115ace98f09e6e77bba33dd1789506676059bba8e9bMichel Dänzer/**
1161d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * This is called when we need to set up GL rendering to a new X window.
1171d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz */
1181d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantzboolean
119d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergdri_create_buffer(__DRIscreen * sPriv,
120d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg		  __DRIdrawable * dPriv,
121d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg		  const struct gl_config * visual, boolean isPixmap)
1221d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz{
123875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct dri_screen *screen = sPriv->driverPrivate;
1241d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   struct dri_drawable *drawable = NULL;
1251d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1261d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   if (isPixmap)
1270929b2bf3cdb54d94da8dee5797878e2ee582b41Thomas Hellstrom      goto fail;		       /* not implemented */
1281d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1291d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   drawable = CALLOC_STRUCT(dri_drawable);
1301d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   if (drawable == NULL)
1311d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz      goto fail;
1321d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
133bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu   dri_fill_st_visual(&drawable->stvis, screen, visual);
1341372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1351372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* setup the st_framebuffer_iface */
1361372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.visual = &drawable->stvis;
1371372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.flush_front = dri_st_framebuffer_flush_front;
1381372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.validate = dri_st_framebuffer_validate;
1391372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.st_manager_private = (void *) drawable;
1401d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
14194ccc31ba4f64ac480137fd90f1ded44d2072f6eJakob Bornecrantz   drawable->screen = screen;
1421d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   drawable->sPriv = sPriv;
1431d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   drawable->dPriv = dPriv;
144bde2fc5a7123829dc87d3761934627555be4446fThomas Hellstrom   drawable->desired_fences = screen->default_throttle_frames;
145bde2fc5a7123829dc87d3761934627555be4446fThomas Hellstrom   if (drawable->desired_fences > DRI_SWAP_FENCES_MAX)
146bde2fc5a7123829dc87d3761934627555be4446fThomas Hellstrom      drawable->desired_fences = DRI_SWAP_FENCES_MAX;
14723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
1480929b2bf3cdb54d94da8dee5797878e2ee582b41Thomas Hellstrom   dPriv->driverPrivate = (void *)drawable;
149ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   p_atomic_set(&drawable->base.stamp, 1);
1501d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1511d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   return GL_TRUE;
15259b4146a5dbeb108b53fc9c4132095e264ba04beZack Rusinfail:
1531d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   FREE(drawable);
1541d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   return GL_FALSE;
1551d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz}
1561d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1571d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantzvoid
158d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergdri_destroy_buffer(__DRIdrawable * dPriv)
1591d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz{
1601d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   struct dri_drawable *drawable = dri_drawable(dPriv);
1611372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   int i;
162ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom
163a30b966f8345cb99922a416fce2da6edb70f864cGeorge Sapountzis   pipe_surface_reference(&drawable->drisw_surface, NULL);
164bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu
1651372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
1661372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      pipe_resource_reference(&drawable->textures[i], NULL);
167bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu
16823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   swap_fences_unref(drawable);
16923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
170a437bc50f2f8ff6e91fdf4dc9758b35cff35645aChia-I Wu   FREE(drawable);
171ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom}
172ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom
173ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz/**
1741372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz * Validate the texture at an attachment.  Allocate the texture if it does not
1755c0a0f219843fa283a0fd98dbe0544e8ea820c60George Sapountzis * exist.  Used by the TFP extension.
1761372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz */
1775c0a0f219843fa283a0fd98dbe0544e8ea820c60George Sapountzisstatic void
1781372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_drawable_validate_att(struct dri_drawable *drawable,
1791372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz                          enum st_attachment_type statt)
1801372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{
1811372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
1821372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   unsigned i, count = 0;
1831372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1841372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* check if buffer already exists */
1851372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   if (drawable->texture_mask & (1 << statt))
1861372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      return;
1871372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1881372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* make sure DRI2 does not destroy existing buffers */
1891372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
1901372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      if (drawable->texture_mask & (1 << i)) {
1911372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz         statts[count++] = i;
1921372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      }
1931372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   }
1941372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   statts[count++] = statt;
1951372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1961372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->texture_stamp = drawable->dPriv->lastStamp - 1;
1971372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1981372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.validate(&drawable->base, statts, count, NULL);
1991372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz}
2001372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
2011372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz/**
202c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis * These are used for GLX_EXT_texture_from_pixmap
203c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis */
204c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisstatic void
205c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisdri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
206c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis                    GLint format, __DRIdrawable *dPriv)
207c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis{
208c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   struct dri_context *ctx = dri_context(pDRICtx);
209c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   struct dri_drawable *drawable = dri_drawable(dPriv);
210c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   struct pipe_resource *pt;
211c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
212c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_drawable_validate_att(drawable, ST_ATTACHMENT_FRONT_LEFT);
213c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
21498aa2a8f725e44aec8bd998fe436a134e94f13bbBenjamin Franzke   /* Use the pipe resource associated with the X drawable */
215c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   pt = drawable->textures[ST_ATTACHMENT_FRONT_LEFT];
216c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
217c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   if (pt) {
218c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      enum pipe_format internal_format = pt->format;
219c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
220c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      if (format == __DRI_TEXTURE_FORMAT_RGB)  {
221c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         /* only need to cover the formats recognized by dri_fill_st_visual */
222c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         switch (internal_format) {
223c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         case PIPE_FORMAT_B8G8R8A8_UNORM:
224c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            internal_format = PIPE_FORMAT_B8G8R8X8_UNORM;
225c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            break;
226c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         case PIPE_FORMAT_A8R8G8B8_UNORM:
227c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            internal_format = PIPE_FORMAT_X8R8G8B8_UNORM;
228c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            break;
229c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         default:
230c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            break;
231c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         }
232c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      }
233c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
23498aa2a8f725e44aec8bd998fe436a134e94f13bbBenjamin Franzke      drawable->update_tex_buffer(drawable, ctx, pt);
23598aa2a8f725e44aec8bd998fe436a134e94f13bbBenjamin Franzke
236c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      ctx->st->teximage(ctx->st,
237c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT,
238c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            0, internal_format, pt, FALSE);
239c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   }
240c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis}
241c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
242c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisstatic void
243c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisdri_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
244c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis                   __DRIdrawable *dPriv)
245c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis{
246c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_set_tex_buffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
247c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis}
248c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
249c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisconst __DRItexBufferExtension driTexBufferExtension = {
250c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
251c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_set_tex_buffer,
252c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_set_tex_buffer2,
253484edfc8151ddf63d3e0e7be3b4c8fa3906a0ec9Jakob Bornecrantz   NULL,
254c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis};
255c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
256c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis/**
257ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz * Get the format and binding of an attachment.
258ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz */
259ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantzvoid
260ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantzdri_drawable_get_format(struct dri_drawable *drawable,
261ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz                        enum st_attachment_type statt,
262ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz                        enum pipe_format *format,
263ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz                        unsigned *bind)
264ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz{
265ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   switch (statt) {
266ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_FRONT_LEFT:
267ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_BACK_LEFT:
268ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_FRONT_RIGHT:
269ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_BACK_RIGHT:
270ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *format = drawable->stvis.color_format;
271ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
272ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      break;
273ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_DEPTH_STENCIL:
274ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *format = drawable->stvis.depth_stencil_format;
275ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *bind = PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */
276ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      break;
277ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   default:
278ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *format = PIPE_FORMAT_NONE;
279ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *bind = 0;
280ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      break;
281ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   }
282ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz}
283ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz
28423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
28523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
28623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * swap_fences_pop_front - pull a fence from the throttle queue
28723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
28823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * If the throttle queue is filled to the desired number of fences,
28923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pull fences off the queue until the number is less than the desired
29023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * number of fences, and return the last fence pulled.
29123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
29223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic struct pipe_fence_handle *
29323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromswap_fences_pop_front(struct dri_drawable *draw)
29423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
29523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_screen *screen = draw->screen->base.screen;
29623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_fence_handle *fence = NULL;
29723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
29823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   if (draw->desired_fences == 0)
29923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      return NULL;
30023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
30123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   if (draw->cur_fences >= draw->desired_fences) {
30223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      screen->fence_reference(screen, &fence, draw->swap_fences[draw->tail]);
30323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      screen->fence_reference(screen, &draw->swap_fences[draw->tail++], NULL);
30423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      draw->tail &= DRI_SWAP_FENCES_MASK;
30523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      --draw->cur_fences;
30623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   }
30723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   return fence;
30823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
30923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
31023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
31123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
31223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * swap_fences_push_back - push a fence onto the throttle queue
31323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
31423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * push a fence onto the throttle queue and pull fences of the queue
31523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * so that the desired number of fences are on the queue.
31623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
31723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic void
31823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromswap_fences_push_back(struct dri_drawable *draw,
31923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom		      struct pipe_fence_handle *fence)
32023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
32123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_screen *screen = draw->screen->base.screen;
32223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
32323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   if (!fence || draw->desired_fences == 0)
32423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      return;
32523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
32623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   while(draw->cur_fences == draw->desired_fences)
32723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      swap_fences_pop_front(draw);
32823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
32923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   draw->cur_fences++;
33023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   screen->fence_reference(screen, &draw->swap_fences[draw->head++],
33123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom			   fence);
33223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   draw->head &= DRI_SWAP_FENCES_MASK;
33323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
33423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
33523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
33623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
33723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * swap_fences_unref - empty the throttle queue
33823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
33923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pulls fences of the throttle queue until it is empty.
34023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
34123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic void
34223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromswap_fences_unref(struct dri_drawable *draw)
34323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
34423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_screen *screen = draw->screen->base.screen;
34523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
34623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   while(draw->cur_fences) {
34723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      screen->fence_reference(screen, &draw->swap_fences[draw->tail++], NULL);
34823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      draw->tail &= DRI_SWAP_FENCES_MASK;
34923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      --draw->cur_fences;
35023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   }
35123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
35223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
35323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
35423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
35523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * dri_throttle - A DRI2ThrottleExtension throttling function.
35623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
35723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pulls a fence off the throttling queue and waits for it if the
35823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * number of fences on the throttling queue has reached the desired
35923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * number.
36023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
36123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * Then flushes to insert a fence at the current rendering position, and
36223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pushes that fence on the queue. This requires that the st_context_iface
36323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * flush method returns a fence even if there are no commands to flush.
36423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
36523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic void
36623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromdri_throttle(__DRIcontext *driCtx, __DRIdrawable *dPriv,
36723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	     enum __DRI2throttleReason reason)
36823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
36923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct dri_drawable *draw = dri_drawable(dPriv);
37023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct st_context_iface *ctxi;
37123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct pipe_screen *screen = draw->screen->base.screen;
37223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct pipe_fence_handle *fence;
37323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
37423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (reason != __DRI2_THROTTLE_SWAPBUFFER &&
37523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	reason != __DRI2_THROTTLE_FLUSHFRONT)
37623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	return;
37723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
37823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    fence = swap_fences_pop_front(draw);
37923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (fence) {
38023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	(void) screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE);
38123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	screen->fence_reference(screen, &fence, NULL);
38223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    }
38323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
38423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (driCtx == NULL)
38523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	return;
38623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
38723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    ctxi = dri_context(driCtx)->st;
38823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    ctxi->flush(ctxi, 0, &fence);
38923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (fence) {
39023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	swap_fences_push_back(draw, fence);
39123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	screen->fence_reference(screen, &fence, NULL);
39223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    }
39323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
39423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
39523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
39623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromconst __DRI2throttleExtension dri2ThrottleExtension = {
39723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    .base = { __DRI2_THROTTLE, __DRI2_THROTTLE_VERSION },
39823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    .throttle = dri_throttle,
39923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom};
40023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
40123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
4021d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz/* vim: set sw=3 ts=8 sts=3 expandtab: */
403