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