dri_drawable.c revision ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4
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" 40d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger 411372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 421372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzstatic boolean 431372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi, 441372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz const enum st_attachment_type *statts, 451372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz unsigned count, 461372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz struct pipe_resource **out) 471372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{ 481372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz struct dri_drawable *drawable = 491372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz (struct dri_drawable *) stfbi->st_manager_private; 501372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz struct dri_screen *screen = dri_screen(drawable->sPriv); 511372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz unsigned statt_mask, new_mask; 521372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz boolean new_stamp; 531372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz int i; 541372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 551372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz statt_mask = 0x0; 561372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz for (i = 0; i < count; i++) 571372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz statt_mask |= (1 << statts[i]); 581372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 591372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz /* record newly allocated textures */ 601372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz new_mask = (statt_mask & ~drawable->texture_mask); 611372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 621372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz /* 631372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz * dPriv->pStamp is the server stamp. It should be accessed with a lock, at 641372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz * least for DRI1. dPriv->lastStamp is the client stamp. It has the value 651372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz * of the server stamp when last checked. 661372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz */ 671372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz new_stamp = (drawable->texture_stamp != drawable->dPriv->lastStamp); 681372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 69a93f9f343a64ce91587af66761399f9d4c180015Jakob Bornecrantz if (new_stamp || new_mask || screen->broken_invalidate) { 70873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis if (new_stamp && drawable->update_drawable_info) 71873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis drawable->update_drawable_info(drawable); 721372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 73873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis drawable->allocate_textures(drawable, statts, count); 741372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 751372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz /* add existing textures */ 761372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz for (i = 0; i < ST_ATTACHMENT_COUNT; i++) { 771372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz if (drawable->textures[i]) 781372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz statt_mask |= (1 << i); 791372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz } 801372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 811372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->texture_stamp = drawable->dPriv->lastStamp; 821372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->texture_mask = statt_mask; 831372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz } 841372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 851372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz if (!out) 861372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz return TRUE; 871372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 881372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz for (i = 0; i < count; i++) { 891372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz out[i] = NULL; 901372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz pipe_resource_reference(&out[i], drawable->textures[statts[i]]); 911372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz } 921372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 931372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz return TRUE; 941372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz} 951372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 961372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzstatic boolean 971372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi, 981372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz enum st_attachment_type statt) 991372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{ 1001372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz struct dri_drawable *drawable = 1011372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz (struct dri_drawable *) stfbi->st_manager_private; 1021372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1031372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz /* XXX remove this and just set the correct one on the framebuffer */ 104873ddf547d5aeb68f37a172d73131c6bc51101f6George Sapountzis drawable->flush_frontbuffer(drawable, statt); 1051372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1061372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz return TRUE; 1071372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz} 1081372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 109ace98f09e6e77bba33dd1789506676059bba8e9bMichel Dänzer/** 1101d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz * This is called when we need to set up GL rendering to a new X window. 1111d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz */ 1121d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantzboolean 113d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergdri_create_buffer(__DRIscreen * sPriv, 114d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable * dPriv, 115d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * visual, boolean isPixmap) 1161d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz{ 117b46fcf25be4d1d5a5d072fbce03c2490bf41203fBen Skeggs struct dri_screen *screen = sPriv->private; 1181d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz struct dri_drawable *drawable = NULL; 1191d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz 1201d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz if (isPixmap) 1210929b2bf3cdb54d94da8dee5797878e2ee582b41Thomas Hellstrom goto fail; /* not implemented */ 1221d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz 1231d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz drawable = CALLOC_STRUCT(dri_drawable); 1241d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz if (drawable == NULL) 1251d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz goto fail; 1261d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz 127bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu dri_fill_st_visual(&drawable->stvis, screen, visual); 1281372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1291372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz /* setup the st_framebuffer_iface */ 1301372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->base.visual = &drawable->stvis; 1311372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->base.flush_front = dri_st_framebuffer_flush_front; 1321372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->base.validate = dri_st_framebuffer_validate; 1331372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->base.st_manager_private = (void *) drawable; 1341d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz 13594ccc31ba4f64ac480137fd90f1ded44d2072f6eJakob Bornecrantz drawable->screen = screen; 1361d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz drawable->sPriv = sPriv; 1371d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz drawable->dPriv = dPriv; 1380929b2bf3cdb54d94da8dee5797878e2ee582b41Thomas Hellstrom dPriv->driverPrivate = (void *)drawable; 139ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom p_atomic_set(&drawable->base.stamp, 1); 1401d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz 1411d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz return GL_TRUE; 14259b4146a5dbeb108b53fc9c4132095e264ba04beZack Rusinfail: 1431d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz FREE(drawable); 1441d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz return GL_FALSE; 1451d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz} 1461d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz 1471d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantzvoid 148d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergdri_destroy_buffer(__DRIdrawable * dPriv) 1491d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz{ 1501d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz struct dri_drawable *drawable = dri_drawable(dPriv); 1511372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz int i; 152ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom 153a30b966f8345cb99922a416fce2da6edb70f864cGeorge Sapountzis pipe_surface_reference(&drawable->drisw_surface, NULL); 154bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu 1551372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz for (i = 0; i < ST_ATTACHMENT_COUNT; i++) 1561372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz pipe_resource_reference(&drawable->textures[i], NULL); 157bd1ce874728c06d08a1f9881f51edbdd2f1c9db0Chia-I Wu 158a437bc50f2f8ff6e91fdf4dc9758b35cff35645aChia-I Wu FREE(drawable); 159ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom} 160ca1f5f7e6c05e34cfe8ef10f29aa19f5547311e6Thomas Hellstrom 161ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz/** 1621372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz * Validate the texture at an attachment. Allocate the texture if it does not 1635c0a0f219843fa283a0fd98dbe0544e8ea820c60George Sapountzis * exist. Used by the TFP extension. 1641372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz */ 1655c0a0f219843fa283a0fd98dbe0544e8ea820c60George Sapountzisstatic void 1661372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantzdri_drawable_validate_att(struct dri_drawable *drawable, 1671372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz enum st_attachment_type statt) 1681372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz{ 1691372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz enum st_attachment_type statts[ST_ATTACHMENT_COUNT]; 1701372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz unsigned i, count = 0; 1711372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1721372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz /* check if buffer already exists */ 1731372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz if (drawable->texture_mask & (1 << statt)) 1741372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz return; 1751372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1761372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz /* make sure DRI2 does not destroy existing buffers */ 1771372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz for (i = 0; i < ST_ATTACHMENT_COUNT; i++) { 1781372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz if (drawable->texture_mask & (1 << i)) { 1791372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz statts[count++] = i; 1801372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz } 1811372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz } 1821372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz statts[count++] = statt; 1831372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1841372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->texture_stamp = drawable->dPriv->lastStamp - 1; 1851372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1861372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz drawable->base.validate(&drawable->base, statts, count, NULL); 1871372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz} 1881372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz 1891372a8f90dc64350e4ac29dbb8c5feb88bc83cd1Jakob Bornecrantz/** 190c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis * These are used for GLX_EXT_texture_from_pixmap 191c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis */ 192c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisstatic void 193c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisdri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target, 194c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis GLint format, __DRIdrawable *dPriv) 195c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis{ 196c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis struct dri_context *ctx = dri_context(pDRICtx); 197c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis struct dri_drawable *drawable = dri_drawable(dPriv); 198c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis struct pipe_resource *pt; 199c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 200c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis dri_drawable_validate_att(drawable, ST_ATTACHMENT_FRONT_LEFT); 201c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 202c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis pt = drawable->textures[ST_ATTACHMENT_FRONT_LEFT]; 203c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 204c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis if (pt) { 205c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis enum pipe_format internal_format = pt->format; 206c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 207c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis if (format == __DRI_TEXTURE_FORMAT_RGB) { 208c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis /* only need to cover the formats recognized by dri_fill_st_visual */ 209c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis switch (internal_format) { 210c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis case PIPE_FORMAT_B8G8R8A8_UNORM: 211c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis internal_format = PIPE_FORMAT_B8G8R8X8_UNORM; 212c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis break; 213c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis case PIPE_FORMAT_A8R8G8B8_UNORM: 214c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis internal_format = PIPE_FORMAT_X8R8G8B8_UNORM; 215c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis break; 216c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis default: 217c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis break; 218c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis } 219c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis } 220c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 221c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis ctx->st->teximage(ctx->st, 222c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT, 223c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 0, internal_format, pt, FALSE); 224c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis } 225c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis} 226c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 227c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisstatic void 228c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisdri_set_tex_buffer(__DRIcontext *pDRICtx, GLint target, 229c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis __DRIdrawable *dPriv) 230c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis{ 231c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis dri_set_tex_buffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv); 232c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis} 233c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 234c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzisconst __DRItexBufferExtension driTexBufferExtension = { 235c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 236c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis dri_set_tex_buffer, 237c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis dri_set_tex_buffer2, 238484edfc8151ddf63d3e0e7be3b4c8fa3906a0ec9Jakob Bornecrantz NULL, 239c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis}; 240c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis 241c14b4371ed58859d264b7b2581cfedc9cfd8401fGeorge Sapountzis/** 242ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz * Get the format and binding of an attachment. 243ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz */ 244ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantzvoid 245ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantzdri_drawable_get_format(struct dri_drawable *drawable, 246ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz enum st_attachment_type statt, 247ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz enum pipe_format *format, 248ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz unsigned *bind) 249ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz{ 250ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz switch (statt) { 251ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz case ST_ATTACHMENT_FRONT_LEFT: 252ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz case ST_ATTACHMENT_BACK_LEFT: 253ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz case ST_ATTACHMENT_FRONT_RIGHT: 254ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz case ST_ATTACHMENT_BACK_RIGHT: 255ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz *format = drawable->stvis.color_format; 256ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz *bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; 257ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz break; 258ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz case ST_ATTACHMENT_DEPTH_STENCIL: 259ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz *format = drawable->stvis.depth_stencil_format; 260ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz *bind = PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */ 261ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz break; 262ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz default: 263ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz *format = PIPE_FORMAT_NONE; 264ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz *bind = 0; 265ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz break; 266ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz } 267ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz} 268ea6a52a1f8e7fd72b5506218c31e58088131f1f5Jakob Bornecrantz 2691d060e36f248b2c1d2575d1e2cbd362b8345ae55Jakob Bornecrantz/* vim: set sw=3 ts=8 sts=3 expandtab: */ 270