dri_drawable.c revision 98aa2a8f725e44aec8bd998fe436a134e94f13bb
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;
561372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
571372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   statt_mask = 0x0;
581372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < count; i++)
591372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      statt_mask |= (1 << statts[i]);
601372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
611372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* record newly allocated textures */
621372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   new_mask = (statt_mask & ~drawable->texture_mask);
631372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
641372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /*
651372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz    * dPriv->pStamp is the server stamp.  It should be accessed with a lock, at
661372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz    * least for DRI1.  dPriv->lastStamp is the client stamp.  It has the value
671372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz    * of the server stamp when last checked.
681372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz    */
691372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   new_stamp = (drawable->texture_stamp != drawable->dPriv->lastStamp);
701372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
71a93f9f343a64ce91587af66761399f9d4c180015Jakob Bornecrantz   if (new_stamp || new_mask || screen->broken_invalidate) {
72873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis      if (new_stamp && drawable->update_drawable_info)
73873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis         drawable->update_drawable_info(drawable);
741372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
75873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis      drawable->allocate_textures(drawable, statts, count);
761372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
771372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      /* add existing textures */
781372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
791372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz         if (drawable->textures[i])
801372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz            statt_mask |= (1 << i);
811372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      }
821372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
831372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      drawable->texture_stamp = drawable->dPriv->lastStamp;
841372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      drawable->texture_mask = statt_mask;
851372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   }
861372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
871372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   if (!out)
881372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      return TRUE;
891372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
901372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < count; i++) {
911372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      out[i] = NULL;
921372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      pipe_resource_reference(&out[i], drawable->textures[statts[i]]);
931372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   }
941372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
951372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   return TRUE;
961372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz}
971372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
981372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzstatic boolean
991372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
1001372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz                               enum st_attachment_type statt)
1011372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{
1021372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   struct dri_drawable *drawable =
1031372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      (struct dri_drawable *) stfbi->st_manager_private;
1041372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1051372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* XXX remove this and just set the correct one on the framebuffer */
106873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis   drawable->flush_frontbuffer(drawable, statt);
1071372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1081372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   return TRUE;
1091372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz}
1101372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
111ace98f09e6e77bba33dd1789506676059bba8e9bMichel Dänzer/**
1121d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * This is called when we need to set up GL rendering to a new X window.
1131d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz */
1141d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantzboolean
115d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergdri_create_buffer(__DRIscreen * sPriv,
116d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg		  __DRIdrawable * dPriv,
117d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg		  const struct gl_config * visual, boolean isPixmap)
1181d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz{
119b46fcf25be4d1d5a5d072fbce03c2490bf41203fBen Skeggs   struct dri_screen *screen = sPriv->private;
1201d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   struct dri_drawable *drawable = NULL;
1211d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1221d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   if (isPixmap)
1230929b2bf3cdb54d94da8dee5797878e2ee582b41Thomas Hellstrom      goto fail;		       /* not implemented */
1241d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1251d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   drawable = CALLOC_STRUCT(dri_drawable);
1261d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   if (drawable == NULL)
1271d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz      goto fail;
1281d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
129bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu   dri_fill_st_visual(&drawable->stvis, screen, visual);
1301372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1311372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* setup the st_framebuffer_iface */
1321372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.visual = &drawable->stvis;
1331372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.flush_front = dri_st_framebuffer_flush_front;
1341372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.validate = dri_st_framebuffer_validate;
1351372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.st_manager_private = (void *) drawable;
1361d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
13794ccc31ba4f64ac480137fd90f1ded44d2072f6eJakob Bornecrantz   drawable->screen = screen;
1381d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   drawable->sPriv = sPriv;
1391d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   drawable->dPriv = dPriv;
140bde2fc5a7123829dc87d3761934627555be4446fThomas Hellstrom   drawable->desired_fences = screen->default_throttle_frames;
141bde2fc5a7123829dc87d3761934627555be4446fThomas Hellstrom   if (drawable->desired_fences > DRI_SWAP_FENCES_MAX)
142bde2fc5a7123829dc87d3761934627555be4446fThomas Hellstrom      drawable->desired_fences = DRI_SWAP_FENCES_MAX;
14323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
1440929b2bf3cdb54d94da8dee5797878e2ee582b41Thomas Hellstrom   dPriv->driverPrivate = (void *)drawable;
145ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   p_atomic_set(&drawable->base.stamp, 1);
1461d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1471d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   return GL_TRUE;
14859b4146a5dbeb108b53fc9c4132095e264ba04beZack Rusinfail:
1491d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   FREE(drawable);
1501d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   return GL_FALSE;
1511d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz}
1521d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz
1531d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantzvoid
154d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergdri_destroy_buffer(__DRIdrawable * dPriv)
1551d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz{
1561d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz   struct dri_drawable *drawable = dri_drawable(dPriv);
1571372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   int i;
158ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom
159a30b966f8345cb99922a416fce2da6edb70f864cGeorge Sapountzis   pipe_surface_reference(&drawable->drisw_surface, NULL);
160bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu
1611372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
1621372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      pipe_resource_reference(&drawable->textures[i], NULL);
163bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu
16423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   swap_fences_unref(drawable);
16523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
166a437bc50f2f8ff6e91fdf4dc9758b35cff35645aChia-I Wu   FREE(drawable);
167ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom}
168ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom
169ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz/**
1701372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz * Validate the texture at an attachment.  Allocate the texture if it does not
1715c0a0f219843fa283a0fd98dbe0544e8ea820c60George Sapountzis * exist.  Used by the TFP extension.
1721372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz */
1735c0a0f219843fa283a0fd98dbe0544e8ea820c60George Sapountzisstatic void
1741372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_drawable_validate_att(struct dri_drawable *drawable,
1751372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz                          enum st_attachment_type statt)
1761372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{
1771372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
1781372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   unsigned i, count = 0;
1791372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1801372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* check if buffer already exists */
1811372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   if (drawable->texture_mask & (1 << statt))
1821372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      return;
1831372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1841372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   /* make sure DRI2 does not destroy existing buffers */
1851372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
1861372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      if (drawable->texture_mask & (1 << i)) {
1871372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz         statts[count++] = i;
1881372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz      }
1891372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   }
1901372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   statts[count++] = statt;
1911372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1921372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->texture_stamp = drawable->dPriv->lastStamp - 1;
1931372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1941372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz   drawable->base.validate(&drawable->base, statts, count, NULL);
1951372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz}
1961372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz
1971372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz/**
198c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis * These are used for GLX_EXT_texture_from_pixmap
199c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis */
200c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisstatic void
201c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisdri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
202c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis                    GLint format, __DRIdrawable *dPriv)
203c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis{
204c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   struct dri_context *ctx = dri_context(pDRICtx);
205c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   struct dri_drawable *drawable = dri_drawable(dPriv);
206c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   struct pipe_resource *pt;
207c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
208c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_drawable_validate_att(drawable, ST_ATTACHMENT_FRONT_LEFT);
209c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
21098aa2a8f725e44aec8bd998fe436a134e94f13bbBenjamin Franzke   /* Use the pipe resource associated with the X drawable */
211c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   pt = drawable->textures[ST_ATTACHMENT_FRONT_LEFT];
212c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
213c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   if (pt) {
214c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      enum pipe_format internal_format = pt->format;
215c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
216c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      if (format == __DRI_TEXTURE_FORMAT_RGB)  {
217c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         /* only need to cover the formats recognized by dri_fill_st_visual */
218c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         switch (internal_format) {
219c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         case PIPE_FORMAT_B8G8R8A8_UNORM:
220c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            internal_format = PIPE_FORMAT_B8G8R8X8_UNORM;
221c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            break;
222c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         case PIPE_FORMAT_A8R8G8B8_UNORM:
223c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            internal_format = PIPE_FORMAT_X8R8G8B8_UNORM;
224c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            break;
225c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         default:
226c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            break;
227c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis         }
228c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      }
229c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
23098aa2a8f725e44aec8bd998fe436a134e94f13bbBenjamin Franzke      drawable->update_tex_buffer(drawable, ctx, pt);
23198aa2a8f725e44aec8bd998fe436a134e94f13bbBenjamin Franzke
232c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis      ctx->st->teximage(ctx->st,
233c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT,
234c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis            0, internal_format, pt, FALSE);
235c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   }
236c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis}
237c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
238c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisstatic void
239c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisdri_set_tex_buffer(__DRIcontext *pDRICtx, GLint target,
240c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis                   __DRIdrawable *dPriv)
241c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis{
242c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_set_tex_buffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
243c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis}
244c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
245c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisconst __DRItexBufferExtension driTexBufferExtension = {
246c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
247c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_set_tex_buffer,
248c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis   dri_set_tex_buffer2,
249484edfc8151ddf63d3e0e7be3b4c8fa3906a0ec9Jakob Bornecrantz   NULL,
250c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis};
251c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis
252c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis/**
253ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz * Get the format and binding of an attachment.
254ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz */
255ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantzvoid
256ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantzdri_drawable_get_format(struct dri_drawable *drawable,
257ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz                        enum st_attachment_type statt,
258ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz                        enum pipe_format *format,
259ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz                        unsigned *bind)
260ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz{
261ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   switch (statt) {
262ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_FRONT_LEFT:
263ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_BACK_LEFT:
264ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_FRONT_RIGHT:
265ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_BACK_RIGHT:
266ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *format = drawable->stvis.color_format;
267ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
268ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      break;
269ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   case ST_ATTACHMENT_DEPTH_STENCIL:
270ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *format = drawable->stvis.depth_stencil_format;
271ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *bind = PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */
272ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      break;
273ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   default:
274ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *format = PIPE_FORMAT_NONE;
275ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      *bind = 0;
276ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz      break;
277ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz   }
278ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz}
279ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz
28023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
28123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
28223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * swap_fences_pop_front - pull a fence from the throttle queue
28323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
28423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * If the throttle queue is filled to the desired number of fences,
28523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pull fences off the queue until the number is less than the desired
28623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * number of fences, and return the last fence pulled.
28723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
28823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic struct pipe_fence_handle *
28923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromswap_fences_pop_front(struct dri_drawable *draw)
29023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
29123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_screen *screen = draw->screen->base.screen;
29223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_fence_handle *fence = NULL;
29323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
29423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   if (draw->desired_fences == 0)
29523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      return NULL;
29623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
29723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   if (draw->cur_fences >= draw->desired_fences) {
29823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      screen->fence_reference(screen, &fence, draw->swap_fences[draw->tail]);
29923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      screen->fence_reference(screen, &draw->swap_fences[draw->tail++], NULL);
30023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      draw->tail &= DRI_SWAP_FENCES_MASK;
30123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      --draw->cur_fences;
30223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   }
30323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   return fence;
30423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
30523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
30623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
30723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
30823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * swap_fences_push_back - push a fence onto the throttle queue
30923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
31023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * push a fence onto the throttle queue and pull fences of the queue
31123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * so that the desired number of fences are on the queue.
31223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
31323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic void
31423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromswap_fences_push_back(struct dri_drawable *draw,
31523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom		      struct pipe_fence_handle *fence)
31623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
31723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_screen *screen = draw->screen->base.screen;
31823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
31923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   if (!fence || draw->desired_fences == 0)
32023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      return;
32123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
32223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   while(draw->cur_fences == draw->desired_fences)
32323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      swap_fences_pop_front(draw);
32423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
32523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   draw->cur_fences++;
32623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   screen->fence_reference(screen, &draw->swap_fences[draw->head++],
32723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom			   fence);
32823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   draw->head &= DRI_SWAP_FENCES_MASK;
32923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
33023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
33123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
33223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
33323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * swap_fences_unref - empty the throttle queue
33423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
33523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pulls fences of the throttle queue until it is empty.
33623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
33723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic void
33823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromswap_fences_unref(struct dri_drawable *draw)
33923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
34023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   struct pipe_screen *screen = draw->screen->base.screen;
34123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
34223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   while(draw->cur_fences) {
34323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      screen->fence_reference(screen, &draw->swap_fences[draw->tail++], NULL);
34423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      draw->tail &= DRI_SWAP_FENCES_MASK;
34523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom      --draw->cur_fences;
34623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom   }
34723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
34823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
34923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
35023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom/**
35123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * dri_throttle - A DRI2ThrottleExtension throttling function.
35223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
35323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pulls a fence off the throttling queue and waits for it if the
35423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * number of fences on the throttling queue has reached the desired
35523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * number.
35623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom *
35723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * Then flushes to insert a fence at the current rendering position, and
35823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * pushes that fence on the queue. This requires that the st_context_iface
35923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom * flush method returns a fence even if there are no commands to flush.
36023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom */
36123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromstatic void
36223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromdri_throttle(__DRIcontext *driCtx, __DRIdrawable *dPriv,
36323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	     enum __DRI2throttleReason reason)
36423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom{
36523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct dri_drawable *draw = dri_drawable(dPriv);
36623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct st_context_iface *ctxi;
36723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct pipe_screen *screen = draw->screen->base.screen;
36823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    struct pipe_fence_handle *fence;
36923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
37023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (reason != __DRI2_THROTTLE_SWAPBUFFER &&
37123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	reason != __DRI2_THROTTLE_FLUSHFRONT)
37223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	return;
37323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
37423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    fence = swap_fences_pop_front(draw);
37523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (fence) {
37623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	(void) screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE);
37723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	screen->fence_reference(screen, &fence, NULL);
37823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    }
37923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
38023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (driCtx == NULL)
38123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	return;
38223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
38323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    ctxi = dri_context(driCtx)->st;
38423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    ctxi->flush(ctxi, 0, &fence);
38523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    if (fence) {
38623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	swap_fences_push_back(draw, fence);
38723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom	screen->fence_reference(screen, &fence, NULL);
38823c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    }
38923c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom}
39023c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
39123c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
39223c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstromconst __DRI2throttleExtension dri2ThrottleExtension = {
39323c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    .base = { __DRI2_THROTTLE, __DRI2_THROTTLE_VERSION },
39423c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom    .throttle = dri_throttle,
39523c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom};
39623c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
39723c41233ce9ac13ba60242f9e839d5b13d1ea803Thomas Hellstrom
3981d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz/* vim: set sw=3 ts=8 sts=3 expandtab: */
399