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