149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/*
249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Mesa 3-D graphics library
349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Version:  7.8
449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * copy of this software and associated documentation files (the "Software"),
949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * to deal in the Software without restriction, including without limitation
1049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
1249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Software is furnished to do so, subject to the following conditions:
1349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
1449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * The above copyright notice and this permission notice shall be included
1549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * in all copies or substantial portions of the Software.
1649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *
17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE.
2449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
2549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
2649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_memory.h"
2749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_math.h"
2849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_format.h"
29f225042a8615e319a911ee0881cec5fc1d1ce0a7Igor Oliveira#include "util/u_inlines.h"
306e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu#include "util/u_hash_table.h"
3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_compiler.h"
3249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_screen.h"
3349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_context.h"
3449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "pipe/p_state.h"
35f9d9574913c5edb92191ac3f5e8d011452427852Jakob Bornecrantz#include "state_tracker/drm_driver.h"
3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "egllog.h"
3749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "native_x11.h"
3949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "x11_screen.h"
4049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
417c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu#include "common/native_helper.h"
42184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef HAVE_WAYLAND_BACKEND
43184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#include "common/native_wayland_drm_bufmgr_helper.h"
44184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif
45184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
46cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#ifdef GLX_DIRECT_RENDERING
47cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu
4849381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct dri2_display {
4949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_display base;
5049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   Display *dpy;
5149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   boolean own_dpy;
5249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
5373df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu   const struct native_event_handler *event_handler;
54e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu
5549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct x11_screen *xscr;
5649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   int xscr_number;
57545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu   const char *dri_driver;
58545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu   int dri_major, dri_minor;
5949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
6049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_config *configs;
6149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   int num_configs;
626e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
636e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   struct util_hash_table *surfaces;
64184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef HAVE_WAYLAND_BACKEND
65184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   struct wl_drm *wl_server_drm; /* for EGL_WL_bind_wayland_display */
66184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif
6749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
6849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
6949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct dri2_surface {
7049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_surface base;
7149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   Drawable drawable;
7249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format color_format;
7349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy;
7449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
756e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   unsigned int server_stamp;
766e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   unsigned int client_stamp;
779d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   int width, height;
78287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
799d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   uint valid_mask;
809d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
819d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   boolean have_back, have_fake;
829d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
839d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   struct x11_drawable_buffer *last_xbufs;
849d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   int last_num_xbufs;
8549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
8649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
8749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct dri2_config {
8849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct native_config base;
8949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu};
9049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
9149381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic INLINE struct dri2_display *
9249381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display(const struct native_display *ndpy)
9349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
9449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return (struct dri2_display *) ndpy;
9549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
9649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
9749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic INLINE struct dri2_surface *
9849381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_surface(const struct native_surface *nsurf)
9949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
10049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return (struct dri2_surface *) nsurf;
10149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
10249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
10349381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic INLINE struct dri2_config *
10449381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_config(const struct native_config *nconf)
10549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
10649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return (struct dri2_config *) nconf;
10749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
10849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
1099d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu/**
11029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu * Process the buffers returned by the server.
1119d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu */
1129d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic void
11329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wudri2_surface_process_drawable_buffers(struct native_surface *nsurf,
11429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu                                      struct x11_drawable_buffer *xbufs,
11529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu                                      int num_xbufs)
11649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
11749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
11849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy = dri2surf->dri2dpy;
119287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource templ;
120b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz   struct winsys_handle whandle;
1219d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   uint valid_mask;
12229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   int i;
12349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
12429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   /* free the old textures */
1259d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++)
126287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&dri2surf->textures[i], NULL);
1279d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   dri2surf->valid_mask = 0x0;
1289d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
1299d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   dri2surf->have_back = FALSE;
1309d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   dri2surf->have_fake = FALSE;
1319d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
1329d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   if (!xbufs)
1339d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      return;
1349d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
1359d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   memset(&templ, 0, sizeof(templ));
1369d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   templ.target = PIPE_TEXTURE_2D;
1379d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   templ.last_level = 0;
1389d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   templ.width0 = dri2surf->width;
1399d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   templ.height0 = dri2surf->height;
1409d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   templ.depth0 = 1;
1414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   templ.array_size = 1;
1429d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   templ.format = dri2surf->color_format;
143287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   templ.bind = PIPE_BIND_RENDER_TARGET;
1449d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
1459d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   valid_mask = 0x0;
14629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   for (i = 0; i < num_xbufs; i++) {
14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      struct x11_drawable_buffer *xbuf = &xbufs[i];
14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      const char *desc;
14949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      enum native_attachment natt;
15049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
15149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      switch (xbuf->attachment) {
15249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      case DRI2BufferFrontLeft:
15349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
15449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         desc = "DRI2 Front Buffer";
15549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         break;
15649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      case DRI2BufferFakeFrontLeft:
15749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
15849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         desc = "DRI2 Fake Front Buffer";
15949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         dri2surf->have_fake = TRUE;
16049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         break;
16149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      case DRI2BufferBackLeft:
16249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         natt = NATIVE_ATTACHMENT_BACK_LEFT;
16349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         desc = "DRI2 Back Buffer";
16449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         dri2surf->have_back = TRUE;
16549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         break;
16649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      default:
16749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         desc = NULL;
16849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         break;
16949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      }
17049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
1719d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      if (!desc || dri2surf->textures[natt]) {
17249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         if (!desc)
17349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu            _eglLog(_EGL_WARNING, "unknown buffer %d", xbuf->attachment);
174fda897ad71738dd76a218280fd2e635d5dcdcee1Chia-I Wu         else
17549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu            _eglLog(_EGL_WARNING, "both real and fake front buffers are listed");
17649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         continue;
17749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      }
17849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
179b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz      memset(&whandle, 0, sizeof(whandle));
180b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz      whandle.stride = xbuf->pitch;
181b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz      whandle.handle = xbuf->name;
182287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      dri2surf->textures[natt] = dri2dpy->base.screen->resource_from_handle(
183b2e94d05c9602e2814a513a51eed67d014b338f3Jakob Bornecrantz         dri2dpy->base.screen, &templ, &whandle);
1849d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      if (dri2surf->textures[natt])
1859d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu         valid_mask |= 1 << natt;
1869d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   }
1879d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
18829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   dri2surf->valid_mask = valid_mask;
18929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu}
19029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
19129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu/**
19229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu * Get the buffers from the server.
19329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu */
19429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wustatic void
19529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wudri2_surface_get_buffers(struct native_surface *nsurf, uint buffer_mask)
19629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu{
19729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
19829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   struct dri2_display *dri2dpy = dri2surf->dri2dpy;
199927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu   unsigned int dri2atts[NUM_NATIVE_ATTACHMENTS * 2];
20029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   int num_ins, num_outs, att;
20129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   struct x11_drawable_buffer *xbufs;
202927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu   uint bpp = util_format_get_blocksizebits(dri2surf->color_format);
203927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu   boolean with_format = FALSE; /* never ask for depth/stencil */
204d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz
205d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz   /* We must get the front on servers which doesn't support with format
206d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz    * due to a silly bug in core dri2. You can't copy to/from a buffer
207d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz    * that you haven't requested and you recive BadValue errors */
208927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu   if (dri2surf->dri2dpy->dri_minor < 1) {
209927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu      with_format = FALSE;
210d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz      buffer_mask |= (1 << NATIVE_ATTACHMENT_FRONT_LEFT);
211927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu   }
21229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
21329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   /* prepare the attachments */
21429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   num_ins = 0;
21529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) {
21629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu      if (native_attachment_mask_test(buffer_mask, att)) {
21729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         unsigned int dri2att;
21829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
21929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         switch (att) {
22029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         case NATIVE_ATTACHMENT_FRONT_LEFT:
22129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            dri2att = DRI2BufferFrontLeft;
22229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            break;
22329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         case NATIVE_ATTACHMENT_BACK_LEFT:
22429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            dri2att = DRI2BufferBackLeft;
22529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            break;
22629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         case NATIVE_ATTACHMENT_FRONT_RIGHT:
22729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            dri2att = DRI2BufferFrontRight;
22829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            break;
22929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         case NATIVE_ATTACHMENT_BACK_RIGHT:
23029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            dri2att = DRI2BufferBackRight;
23129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            break;
23229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         default:
23329ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            assert(0);
23429ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            dri2att = 0;
23529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu            break;
23629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu         }
23729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
238927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu         dri2atts[num_ins++] = dri2att;
239927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu         if (with_format)
240927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu            dri2atts[num_ins++] = bpp;
24129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu      }
24229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   }
243927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu   if (with_format)
244927e576284e3d8b10a3f5b46bc7680c579a6ff32Chia-I Wu      num_ins /= 2;
24529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
24629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   xbufs = x11_drawable_get_buffers(dri2dpy->xscr, dri2surf->drawable,
24729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu                                    &dri2surf->width, &dri2surf->height,
248d93c34cf70e255805a634611e971e9b0e6da1996Jakob Bornecrantz                                    dri2atts, with_format, num_ins, &num_outs);
24929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
25029ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   /* we should be able to do better... */
25129ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   if (xbufs && dri2surf->last_num_xbufs == num_outs &&
25229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu       memcmp(dri2surf->last_xbufs, xbufs, sizeof(*xbufs) * num_outs) == 0) {
253870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(xbufs);
2546e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      dri2surf->client_stamp = dri2surf->server_stamp;
25529ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu      return;
25629ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   }
25729ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
25829ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu   dri2_surface_process_drawable_buffers(&dri2surf->base, xbufs, num_outs);
25929ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
2606e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   dri2surf->server_stamp++;
2616e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   dri2surf->client_stamp = dri2surf->server_stamp;
26229ec53d8439eab85f39de02bd18539c26410d2bfChia-I Wu
2639d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   if (dri2surf->last_xbufs)
264870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(dri2surf->last_xbufs);
2659d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   dri2surf->last_xbufs = xbufs;
2669d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   dri2surf->last_num_xbufs = num_outs;
2679d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu}
2689d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
2699d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu/**
2709d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu * Update the buffers of the surface.  This is a slow function due to the
2719d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu * round-trip to the server.
2729d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu */
2739d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean
2749d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wudri2_surface_update_buffers(struct native_surface *nsurf, uint buffer_mask)
2759d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{
2769d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
2779d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
278f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   dri2_surface_get_buffers(&dri2surf->base, buffer_mask);
27949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
2809d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   return ((dri2surf->valid_mask & buffer_mask) == buffer_mask);
2819d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu}
2829d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
2836e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu/**
2846e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu * Return TRUE if the surface receives DRI2_InvalidateBuffers events.
2856e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu */
2866e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic INLINE boolean
2876e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_surface_receive_events(struct native_surface *nsurf)
2886e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{
2896e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
2906e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   return (dri2surf->dri2dpy->dri_minor >= 3);
2916e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu}
2926e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
2939d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean
2949d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wudri2_surface_flush_frontbuffer(struct native_surface *nsurf)
2959d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{
2969d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
2979d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   struct dri2_display *dri2dpy = dri2surf->dri2dpy;
2989d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
2999d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   /* copy to real front buffer */
3009d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   if (dri2surf->have_fake)
3019d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
3029d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu            0, 0, dri2surf->width, dri2surf->height,
3039d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu            DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
3049d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3056e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   /* force buffers to be updated in next validation call */
306e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   if (!dri2_surface_receive_events(&dri2surf->base)) {
3076e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      dri2surf->server_stamp++;
308e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu      dri2dpy->event_handler->invalid_surface(&dri2dpy->base,
309e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu            &dri2surf->base, dri2surf->server_stamp);
310e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   }
3116e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
3129d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   return TRUE;
3139d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu}
3149d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3159d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean
316a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglunddri2_surface_swap_buffers(struct native_surface *nsurf, int num_rects,
317a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund                          const int *rects)
3189d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{
3199d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
3209d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   struct dri2_display *dri2dpy = dri2surf->dri2dpy;
3219d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3229d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   /* copy to front buffer */
323a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund   if (dri2surf->have_back) {
324a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund      if (num_rects > 0)
325a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund         x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
326a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               num_rects, rects,
327a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               DRI2BufferBackLeft, DRI2BufferFrontLeft);
328a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund      else
329a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund         x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
330a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               0, 0, dri2surf->width, dri2surf->height,
331a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               DRI2BufferBackLeft, DRI2BufferFrontLeft);
332a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund   }
3339d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3349d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   /* and update fake front buffer */
335a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund   if (dri2surf->have_fake) {
336a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund      if (num_rects > 0)
337a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund         x11_drawable_copy_buffers_region(dri2dpy->xscr, dri2surf->drawable,
338a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               num_rects, rects,
339a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
340a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund      else
341a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund         x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
342a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               0, 0, dri2surf->width, dri2surf->height,
343a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund               DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
344a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund   }
3459d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3466e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   /* force buffers to be updated in next validation call */
347e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   if (!dri2_surface_receive_events(&dri2surf->base)) {
3486e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      dri2surf->server_stamp++;
349e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu      dri2dpy->event_handler->invalid_surface(&dri2dpy->base,
350e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu            &dri2surf->base, dri2surf->server_stamp);
351e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   }
3526e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
3539d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   return TRUE;
3549d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu}
3559d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3569d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wustatic boolean
35794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wudri2_surface_present(struct native_surface *nsurf,
35808e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu                     const struct native_present_control *ctrl)
35994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu{
36094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   boolean ret;
36194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu
36208e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   if (ctrl->swap_interval)
36394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      return FALSE;
36494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu
36508e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu   switch (ctrl->natt) {
36694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   case NATIVE_ATTACHMENT_FRONT_LEFT:
36794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      ret = dri2_surface_flush_frontbuffer(nsurf);
36894bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      break;
36994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   case NATIVE_ATTACHMENT_BACK_LEFT:
370a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund      ret = dri2_surface_swap_buffers(nsurf, ctrl->num_rects, ctrl->rects);
37194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      break;
37294bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   default:
37394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      ret = FALSE;
37494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      break;
37594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   }
37694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu
37794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   return ret;
37894bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu}
37994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu
38094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wustatic boolean
3819d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wudri2_surface_validate(struct native_surface *nsurf, uint attachment_mask,
382287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                      unsigned int *seq_num, struct pipe_resource **textures,
3839d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu                      int *width, int *height)
3849d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu{
3859d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
3869d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3876e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   if (dri2surf->server_stamp != dri2surf->client_stamp ||
3886e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu       (dri2surf->valid_mask & attachment_mask) != attachment_mask) {
3896e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      if (!dri2_surface_update_buffers(&dri2surf->base, attachment_mask))
3906e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu         return FALSE;
3916e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   }
39249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
3936cb89b23eeac50cfb0c5fb8d77e19f869b524eacChia-I Wu   if (seq_num)
3946e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      *seq_num = dri2surf->client_stamp;
3959d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
3969d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   if (textures) {
3979d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      int att;
3989d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      for (att = 0; att < NUM_NATIVE_ATTACHMENTS; att++) {
3999d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu         if (native_attachment_mask_test(attachment_mask, att)) {
400287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            struct pipe_resource *ptex = dri2surf->textures[att];
4019d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
4029d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu            textures[att] = NULL;
403287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            pipe_resource_reference(&textures[att], ptex);
4049d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu         }
4059d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      }
4069d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   }
4079d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
40849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (width)
40949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      *width = dri2surf->width;
41049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (height)
41149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      *height = dri2surf->height;
41249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
41349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return TRUE;
41449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
41549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
41649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic void
41749381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_surface_wait(struct native_surface *nsurf)
41849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
41949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
42049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy = dri2surf->dri2dpy;
42149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
42249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (dri2surf->have_fake) {
42349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      x11_drawable_copy_buffers(dri2dpy->xscr, dri2surf->drawable,
42449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu            0, 0, dri2surf->width, dri2surf->height,
42549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu            DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
42649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
42749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
42849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
42949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic void
43049381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_surface_destroy(struct native_surface *nsurf)
43149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
43249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_surface *dri2surf = dri2_surface(nsurf);
43349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   int i;
43449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
4359d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu   if (dri2surf->last_xbufs)
436870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(dri2surf->last_xbufs);
4379d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
43849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++) {
439287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      struct pipe_resource *ptex = dri2surf->textures[i];
440287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&ptex, NULL);
44149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
44249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
4436e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   if (dri2surf->drawable) {
44449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      x11_drawable_enable_dri2(dri2surf->dri2dpy->xscr,
44549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu            dri2surf->drawable, FALSE);
4466e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
4476e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      util_hash_table_remove(dri2surf->dri2dpy->surfaces,
4486e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu            (void *) dri2surf->drawable);
4496e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   }
450870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   FREE(dri2surf);
45149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
45249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
45349381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic struct dri2_surface *
45449381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_create_surface(struct native_display *ndpy,
45549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                            Drawable drawable,
456af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu                            enum pipe_format color_format)
45749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
45849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy = dri2_display(ndpy);
45949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_surface *dri2surf;
46049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
46149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2surf = CALLOC_STRUCT(dri2_surface);
46249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!dri2surf)
46349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return NULL;
46449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
46549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2surf->dri2dpy = dri2dpy;
46649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2surf->drawable = drawable;
467af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu   dri2surf->color_format = color_format;
46849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
46949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2surf->base.destroy = dri2_surface_destroy;
47094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   dri2surf->base.present = dri2_surface_present;
47149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2surf->base.validate = dri2_surface_validate;
47249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2surf->base.wait = dri2_surface_wait;
47349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
4746e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   if (drawable) {
4759d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu      x11_drawable_enable_dri2(dri2dpy->xscr, drawable, TRUE);
4766e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      /* initialize the geometry */
4776e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      dri2_surface_update_buffers(&dri2surf->base, 0x0);
4786e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
4796e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      util_hash_table_set(dri2surf->dri2dpy->surfaces,
4806e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu            (void *) dri2surf->drawable, (void *) &dri2surf->base);
4816e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   }
4829d88006ca62bd1cd95e775852f4d797963b3fa20Chia-I Wu
48349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return dri2surf;
48449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
48549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
48649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic struct native_surface *
48749381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_create_window_surface(struct native_display *ndpy,
48849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                   EGLNativeWindowType win,
48949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                   const struct native_config *nconf)
49049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
49149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_surface *dri2surf;
49249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
493af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu   dri2surf = dri2_display_create_surface(ndpy,
494af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu         (Drawable) win, nconf->color_format);
49549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return (dri2surf) ? &dri2surf->base : NULL;
49649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
49749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
49849381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic struct native_surface *
49949381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_create_pixmap_surface(struct native_display *ndpy,
50049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                   EGLNativePixmapType pix,
50149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                                   const struct native_config *nconf)
50249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
50349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_surface *dri2surf;
50449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
505af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu   if (!nconf) {
506af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu      struct dri2_display *dri2dpy = dri2_display(ndpy);
507af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu      uint depth, nconf_depth;
508af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu      int i;
509af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu
510af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu      depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix);
511af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu      for (i = 0; i < dri2dpy->num_configs; i++) {
512af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu         nconf_depth = util_format_get_blocksizebits(
513af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu               dri2dpy->configs[i].base.color_format);
514af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu         /* simple depth match for now */
515af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu         if (depth == nconf_depth ||
516af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu             (depth == 24 && depth + 8 == nconf_depth)) {
517af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu            nconf = &dri2dpy->configs[i].base;
518af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu            break;
519af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu         }
520af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu      }
521af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu
522af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu      if (!nconf)
523af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu         return NULL;
524af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu   }
525af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu
526af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu   dri2surf = dri2_display_create_surface(ndpy,
527af767ee1133058bb24e2183e8bf2846424c96ee0Chia-I Wu         (Drawable) pix, nconf->color_format);
52849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return (dri2surf) ? &dri2surf->base : NULL;
52949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
53049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
53149381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic int
53249381d63e61c724b156b76068058df1c01a906c2Chia-I Wuchoose_color_format(const __GLcontextModes *mode, enum pipe_format formats[32])
53349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
53449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   int count = 0;
53549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
53649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   switch (mode->rgbBits) {
53749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   case 32:
53849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      formats[count++] = PIPE_FORMAT_B8G8R8A8_UNORM;
539ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca      formats[count++] = PIPE_FORMAT_A8R8G8B8_UNORM;
54049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      break;
54149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   case 24:
54249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      formats[count++] = PIPE_FORMAT_B8G8R8X8_UNORM;
543ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca      formats[count++] = PIPE_FORMAT_X8R8G8B8_UNORM;
54449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      formats[count++] = PIPE_FORMAT_B8G8R8A8_UNORM;
545ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca      formats[count++] = PIPE_FORMAT_A8R8G8B8_UNORM;
54649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      break;
54749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   case 16:
548ae3926011e6bd08ac921209cb4b189df4c255007José Fonseca      formats[count++] = PIPE_FORMAT_B5G6R5_UNORM;
54949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      break;
55049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   default:
55149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      break;
55249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
55349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
55449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return count;
55549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
55649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
55749381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean
55849381d63e61c724b156b76068058df1c01a906c2Chia-I Wuis_format_supported(struct pipe_screen *screen,
5592a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger                    enum pipe_format fmt, unsigned sample_count, boolean is_color)
56049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
5612a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger   return screen->is_format_supported(screen, fmt, PIPE_TEXTURE_2D, sample_count,
562287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         (is_color) ? PIPE_BIND_RENDER_TARGET :
563e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák         PIPE_BIND_DEPTH_STENCIL);
56449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
56549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
56649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean
56749381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_convert_config(struct native_display *ndpy,
56849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                            const __GLcontextModes *mode,
56949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu                            struct native_config *nconf)
57049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
57149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   enum pipe_format formats[32];
57249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   int num_formats, i;
5732a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger   int sample_count = 0;
57449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
57549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!(mode->renderType & GLX_RGBA_BIT) || !mode->rgbMode)
57649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return FALSE;
57749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
578f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   /* only interested in native renderable configs */
579f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   if (!mode->xRenderable || !mode->drawableType)
580f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      return FALSE;
58149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
582445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   /* fast/slow configs are probably not relevant */
583445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   if (mode->visualRating == GLX_SLOW_CONFIG)
584445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      return FALSE;
585445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu
586f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   nconf->buffer_mask = 1 << NATIVE_ATTACHMENT_FRONT_LEFT;
587f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   if (mode->doubleBufferMode)
588f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_BACK_LEFT;
589f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   if (mode->stereoMode) {
590f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_FRONT_RIGHT;
591f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      if (mode->doubleBufferMode)
592f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu         nconf->buffer_mask |= 1 << NATIVE_ATTACHMENT_BACK_RIGHT;
593f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   }
594f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu
59549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /* choose color format */
59649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   num_formats = choose_color_format(mode, formats);
59749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   for (i = 0; i < num_formats; i++) {
5982a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger      if (is_format_supported(ndpy->screen, formats[i], sample_count, TRUE)) {
59949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         nconf->color_format = formats[i];
60049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         break;
60149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      }
60249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
60349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (nconf->color_format == PIPE_FORMAT_NONE)
60449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return FALSE;
60549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
606445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   if ((mode->drawableType & GLX_WINDOW_BIT) && mode->visualID)
607f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->window_bit = TRUE;
608f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   if (mode->drawableType & GLX_PIXMAP_BIT)
609f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->pixmap_bit = TRUE;
610f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu
611f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   nconf->native_visual_id = mode->visualID;
612445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   switch (mode->visualType) {
613445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   case GLX_TRUE_COLOR:
614445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      nconf->native_visual_type = TrueColor;
615445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      break;
616445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   case GLX_DIRECT_COLOR:
617445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      nconf->native_visual_type = DirectColor;
618445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      break;
619445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   case GLX_PSEUDO_COLOR:
620445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      nconf->native_visual_type = PseudoColor;
621445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      break;
622445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   case GLX_STATIC_COLOR:
623445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      nconf->native_visual_type = StaticColor;
624445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      break;
625445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   case GLX_GRAY_SCALE:
626445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      nconf->native_visual_type = GrayScale;
627445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      break;
628445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   case GLX_STATIC_GRAY:
629445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      nconf->native_visual_type = StaticGray;
630445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu      break;
631445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu   }
632f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   nconf->level = mode->level;
633f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu
634f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   if (mode->transparentPixel == GLX_TRANSPARENT_RGB) {
635f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->transparent_rgb = TRUE;
636f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->transparent_rgb_values[0] = mode->transparentRed;
637f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->transparent_rgb_values[1] = mode->transparentGreen;
638f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu      nconf->transparent_rgb_values[2] = mode->transparentBlue;
639f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu   }
640f7730c0740cc8a43c3573dcdbf43e76630d957f6Chia-I Wu
64149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return TRUE;
64249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
64349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
64449381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic const struct native_config **
64549381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_get_configs(struct native_display *ndpy, int *num_configs)
64649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
64749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy = dri2_display(ndpy);
64849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   const struct native_config **configs;
64949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   int i;
65049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
65149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   /* first time */
65249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!dri2dpy->configs) {
65349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      const __GLcontextModes *modes;
65449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      int num_modes, count;
65549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
65649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      modes = x11_screen_get_glx_configs(dri2dpy->xscr);
65749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      if (!modes)
65849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         return NULL;
65949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      num_modes = x11_context_modes_count(modes);
66049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
661870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      dri2dpy->configs = CALLOC(num_modes, sizeof(*dri2dpy->configs));
66249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      if (!dri2dpy->configs)
66349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         return NULL;
66449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
66549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      count = 0;
66649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      for (i = 0; i < num_modes; i++) {
66749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         struct native_config *nconf = &dri2dpy->configs[count].base;
668445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu
669445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu         if (dri2_display_convert_config(&dri2dpy->base, modes, nconf)) {
670445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu            int j;
671445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu            /* look for duplicates */
672445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu            for (j = 0; j < count; j++) {
673445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu               if (memcmp(&dri2dpy->configs[j], nconf, sizeof(*nconf)) == 0)
674445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu                  break;
675445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu            }
676445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu            if (j == count)
677445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu               count++;
678445cb9e53b1a98eb8af6ec499912a52b03fb1ce3Chia-I Wu         }
67949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         modes = modes->next;
68049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      }
68149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
68249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      dri2dpy->num_configs = count;
68349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
68449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
685870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   configs = MALLOC(dri2dpy->num_configs * sizeof(*configs));
68649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (configs) {
68749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      for (i = 0; i < dri2dpy->num_configs; i++)
68849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         configs[i] = (const struct native_config *) &dri2dpy->configs[i];
68949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      if (num_configs)
69049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         *num_configs = dri2dpy->num_configs;
69149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
69249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
69349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return configs;
69449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
69549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
696f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wustatic boolean
697a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wudri2_display_get_pixmap_format(struct native_display *ndpy,
698a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu                               EGLNativePixmapType pix,
699a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu                               enum pipe_format *format)
700f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu{
701f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu   struct dri2_display *dri2dpy = dri2_display(ndpy);
702a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   boolean ret = EGL_TRUE;
703a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   uint depth;
704f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu
705f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu   depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix);
706a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   switch (depth) {
707a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   case 32:
708a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   case 24:
709a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu      *format = PIPE_FORMAT_B8G8R8A8_UNORM;
710a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu      break;
711a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   case 16:
712a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu      *format = PIPE_FORMAT_B5G6R5_UNORM;
713a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu      break;
714a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   default:
715a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu      *format = PIPE_FORMAT_NONE;
716a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu      ret = EGL_FALSE;
717a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu      break;
718a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   }
719f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu
720a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   return ret;
721f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu}
722f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu
723fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wustatic int
724fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wudri2_display_get_param(struct native_display *ndpy,
725fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu                       enum native_param_type param)
726fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu{
727fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   int val;
728fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu
729fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   switch (param) {
730fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   case NATIVE_PARAM_USE_NATIVE_BUFFER:
73194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      /* DRI2GetBuffers uses the native buffers */
73294bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      val = TRUE;
73394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      break;
73494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   case NATIVE_PARAM_PRESERVE_BUFFER:
73594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu      /* DRI2CopyRegion is used */
736fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu      val = TRUE;
737fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu      break;
738a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund   case NATIVE_PARAM_PRESENT_REGION:
739a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund      val = TRUE;
740a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund      break;
74194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu   case NATIVE_PARAM_MAX_SWAP_INTERVAL:
742fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   default:
743fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu      val = 0;
744fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu      break;
745fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   }
746fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu
747fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   return val;
748fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu}
749fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu
75049381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic void
75149381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_destroy(struct native_display *ndpy)
75249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
75349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy = dri2_display(ndpy);
75449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
75549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (dri2dpy->configs)
756870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(dri2dpy->configs);
75749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
75849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (dri2dpy->base.screen)
75949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      dri2dpy->base.screen->destroy(dri2dpy->base.screen);
76049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
7616e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   if (dri2dpy->surfaces)
7626e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      util_hash_table_destroy(dri2dpy->surfaces);
7636e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
76449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (dri2dpy->xscr)
76549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      x11_screen_destroy(dri2dpy->xscr);
76649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (dri2dpy->own_dpy)
76749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      XCloseDisplay(dri2dpy->dpy);
768870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   FREE(dri2dpy);
76949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
77049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
7716e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic void
7726e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_display_invalidate_buffers(struct x11_screen *xscr, Drawable drawable,
7736e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu                                void *user_data)
7746e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{
7756e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   struct native_display *ndpy = (struct native_display* ) user_data;
7766e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   struct dri2_display *dri2dpy = dri2_display(ndpy);
7776e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   struct native_surface *nsurf;
7786e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   struct dri2_surface *dri2surf;
7796e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
7806e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   nsurf = (struct native_surface *)
7816e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      util_hash_table_get(dri2dpy->surfaces, (void *) drawable);
7826e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   if (!nsurf)
7836e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      return;
7846e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
7856e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   dri2surf = dri2_surface(nsurf);
786e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu
7876e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   dri2surf->server_stamp++;
788e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   dri2dpy->event_handler->invalid_surface(&dri2dpy->base,
789e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu         &dri2surf->base, dri2surf->server_stamp);
7906e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu}
7916e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
79249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/**
79349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Initialize DRI2 and pipe screen.
79449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */
79549381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean
79649381d63e61c724b156b76068058df1c01a906c2Chia-I Wudri2_display_init_screen(struct native_display *ndpy)
79749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
79849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy = dri2_display(ndpy);
79949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   int fd;
80049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
80149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_DRI2) ||
80249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu       !x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_GLX)) {
80349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      _eglLog(_EGL_WARNING, "GLX/DRI2 is not supported");
80449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return FALSE;
80549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
80649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
807545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu   dri2dpy->dri_driver = x11_screen_probe_dri2(dri2dpy->xscr,
808545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu         &dri2dpy->dri_major, &dri2dpy->dri_minor);
809545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu
8106e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   fd = x11_screen_enable_dri2(dri2dpy->xscr,
8116e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu         dri2_display_invalidate_buffers, &dri2dpy->base);
81249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (fd < 0)
81349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return FALSE;
81449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
815d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu   dri2dpy->base.screen =
816d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu      dri2dpy->event_handler->new_drm_screen(&dri2dpy->base,
817d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu            dri2dpy->dri_driver, fd);
81849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!dri2dpy->base.screen) {
819e28ecdee0396cc6665f9be95cfbaa2c2db1d4891Kristian Høgsberg      _eglLog(_EGL_DEBUG, "failed to create DRM screen");
82049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return FALSE;
82149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
82249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
82349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return TRUE;
82449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
82549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
8266e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic unsigned
8276e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_display_hash_table_hash(void *key)
8286e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{
8296e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   XID drawable = pointer_to_uintptr(key);
8306e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   return (unsigned) drawable;
8316e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu}
8326e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
8336e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wustatic int
8346e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wudri2_display_hash_table_compare(void *key1, void *key2)
8356e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu{
83697e9a0e23f0e06d020883c37b9d065e8978a47f4Chia-I Wu   return ((char *) key1 - (char *) key2);
8376e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu}
8386e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
8397aadb53ef020b13658c9a99ecffe554af8755420Chia-I Wu#ifdef HAVE_WAYLAND_BACKEND
8407aadb53ef020b13658c9a99ecffe554af8755420Chia-I Wu
841184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic int
842184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkedri2_display_authenticate(void *user_data, uint32_t magic)
843184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{
844184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   struct native_display *ndpy = user_data;
845184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   struct dri2_display *dri2dpy = dri2_display(ndpy);
846184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
847184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   return x11_screen_authenticate(dri2dpy->xscr, magic);
848184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke}
849184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
850184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic struct wayland_drm_callbacks wl_drm_callbacks = {
851184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   dri2_display_authenticate,
852184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   egl_g3d_wl_drm_helper_reference_buffer,
853184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   egl_g3d_wl_drm_helper_unreference_buffer
854184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke};
855184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
856184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic boolean
857184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkedri2_display_bind_wayland_display(struct native_display *ndpy,
858184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke                                  struct wl_display *wl_dpy)
859184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{
860184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   struct dri2_display *dri2dpy = dri2_display(ndpy);
861184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
862184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   if (dri2dpy->wl_server_drm)
863184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke      return FALSE;
864184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
865184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   dri2dpy->wl_server_drm = wayland_drm_init(wl_dpy,
866184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke         x11_screen_get_device_name(dri2dpy->xscr),
867184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke         &wl_drm_callbacks, ndpy);
868184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
869184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   if (!dri2dpy->wl_server_drm)
870184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke      return FALSE;
871184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
872184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   return TRUE;
873184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke}
874184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
875184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic boolean
876184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkedri2_display_unbind_wayland_display(struct native_display *ndpy,
877184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke                                    struct wl_display *wl_dpy)
878184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{
879184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   struct dri2_display *dri2dpy = dri2_display(ndpy);
880184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
881184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   if (!dri2dpy->wl_server_drm)
882184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke      return FALSE;
883184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
884184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   wayland_drm_uninit(dri2dpy->wl_server_drm);
885184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   dri2dpy->wl_server_drm = NULL;
886184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
887184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   return TRUE;
888184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke}
889184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
890184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic struct native_display_wayland_bufmgr dri2_display_wayland_bufmgr = {
891184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   dri2_display_bind_wayland_display,
892184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   dri2_display_unbind_wayland_display,
893a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg   egl_g3d_wl_drm_common_wl_buffer_get_resource,
894a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg   egl_g3d_wl_drm_common_query_buffer
895184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke};
896184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
897184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif /* HAVE_WAYLAND_BACKEND */
898184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
89949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct native_display *
900f22665df95406567193dee0089f4830664ff4101Chia-I Wux11_create_dri2_display(Display *dpy,
90173df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu                        const struct native_event_handler *event_handler)
90249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{
90349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   struct dri2_display *dri2dpy;
90449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
90549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy = CALLOC_STRUCT(dri2_display);
90649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!dri2dpy)
90749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return NULL;
90849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
909e38f28ddedd6d4902ae18b1bf243e67d4b16decbChia-I Wu   dri2dpy->event_handler = event_handler;
91049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
91149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy->dpy = dpy;
91249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!dri2dpy->dpy) {
91349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      dri2dpy->dpy = XOpenDisplay(NULL);
91449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      if (!dri2dpy->dpy) {
91549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         dri2_display_destroy(&dri2dpy->base);
91649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu         return NULL;
91749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      }
91849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      dri2dpy->own_dpy = TRUE;
91949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
92049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
92149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy->xscr_number = DefaultScreen(dri2dpy->dpy);
92249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy->xscr = x11_screen_create(dri2dpy->dpy, dri2dpy->xscr_number);
92349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   if (!dri2dpy->xscr) {
92449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      dri2_display_destroy(&dri2dpy->base);
92549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu      return NULL;
92649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   }
92749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
9286e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   dri2dpy->surfaces = util_hash_table_create(dri2_display_hash_table_hash,
9296e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu         dri2_display_hash_table_compare);
9306e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   if (!dri2dpy->surfaces) {
9316e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      dri2_display_destroy(&dri2dpy->base);
9326e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu      return NULL;
9336e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu   }
9346e28a4e0bcd98327838855175a5b214c31a4cde0Chia-I Wu
93573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu   dri2dpy->base.init_screen = dri2_display_init_screen;
93649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy->base.destroy = dri2_display_destroy;
937fade8a6eb639d633cfdbba4a3ba3aa3cc5c04fa6Chia-I Wu   dri2dpy->base.get_param = dri2_display_get_param;
93849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy->base.get_configs = dri2_display_get_configs;
939a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu   dri2dpy->base.get_pixmap_format = dri2_display_get_pixmap_format;
9407c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu   dri2dpy->base.copy_to_pixmap = native_display_copy_to_pixmap;
94149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy->base.create_window_surface = dri2_display_create_window_surface;
94249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   dri2dpy->base.create_pixmap_surface = dri2_display_create_pixmap_surface;
943184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef HAVE_WAYLAND_BACKEND
944184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   dri2dpy->base.wayland_bufmgr = &dri2_display_wayland_bufmgr;
945184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif
94649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu
94749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu   return &dri2dpy->base;
94849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}
949cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu
950cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#else /* GLX_DIRECT_RENDERING */
951cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu
952cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wustruct native_display *
953cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wux11_create_dri2_display(Display *dpy,
954ed47d65c7c05d7dd5a5b4cafaa32afbd4fff0befChia-I Wu                        const struct native_event_handler *event_handler)
955cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu{
956cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu   return NULL;
957cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu}
958cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu
959cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#endif /* GLX_DIRECT_RENDERING */
960