1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author: Alan Hourihane <alanh@tungstengraphics.com>
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author: Jakob Bornecrantz <wallbraker@gmail.com>
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg-server.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xf86.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xf86_OSproc.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_tracker.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_exa.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri2.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/drm_driver.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Make all the #if cases in the code esier to read */
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef DRI2INFOREC_VERSION
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DRI2INFOREC_VERSION 1
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION == 2
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool set_format_in_do_create_buffer;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct {
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PixmapPtr pPixmap;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_resource *tex;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_fence_handle *fence;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} *BufferPrivatePtr;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_do_create_buffer(DrawablePtr pDraw, DRI2BufferPtr buffer, unsigned int format)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct pipe_resource *tex = NULL;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ScreenPtr pScreen = pDraw->pScreen;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(pScrn);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct exa_pixmap_priv *exa_priv;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    BufferPrivatePtr private = buffer->driverPrivate;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PixmapPtr pPixmap;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct winsys_handle whandle;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pDraw->type == DRAWABLE_PIXMAP)
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pPixmap = (PixmapPtr) pDraw;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    else
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pPixmap = (*pScreen->GetWindowPixmap)((WindowPtr) pDraw);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    exa_priv = exaGetPixmapDriverPrivate(pPixmap);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    switch (buffer->attachment) {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    default:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (buffer->attachment != DRI2BufferFakeFrontLeft ||
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    pDraw->type != DRAWABLE_PIXMAP) {
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    private->pPixmap = (*pScreen->CreatePixmap)(pScreen, pDraw->width,
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							pDraw->height,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							pDraw->depth,
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							0);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DRI2BufferFrontLeft:
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DRI2BufferStencil:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION >= 3
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DRI2BufferDepthStencil:
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Works on old X servers because sanity checking is for the weak */
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case 9:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (exa_priv->depth_stencil_tex &&
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    !util_format_is_depth_or_stencil(exa_priv->depth_stencil_tex->format))
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    exa_priv->depth_stencil_tex = NULL;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        /* Fall through */
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case DRI2BufferDepth:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (exa_priv->depth_stencil_tex)
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    pipe_resource_reference(&tex, exa_priv->depth_stencil_tex);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        else {
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    struct pipe_resource template;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            unsigned depthBits = (format != 0) ? format : pDraw->depth;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    memset(&template, 0, sizeof(template));
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    template.target = PIPE_TEXTURE_2D;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (buffer->attachment == DRI2BufferDepth) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               switch(depthBits) {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               case 16:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  template.format = PIPE_FORMAT_Z16_UNORM;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  break;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               case 32:
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  template.format = PIPE_FORMAT_Z32_UNORM;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  break;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               default:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  template.format = ms->ds_depth_bits_last ?
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    PIPE_FORMAT_Z24X8_UNORM : PIPE_FORMAT_X8Z24_UNORM;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  break;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               template.format = ms->ds_depth_bits_last ?
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 PIPE_FORMAT_Z24_UNORM_S8_UINT : PIPE_FORMAT_S8_UINT_Z24_UNORM;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    template.width0 = pDraw->width;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    template.height0 = pDraw->height;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    template.depth0 = 1;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    template.array_size = 1;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    template.last_level = 0;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    template.bind = PIPE_BIND_DEPTH_STENCIL |
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		PIPE_BIND_SHARED;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex = ms->screen->resource_create(ms->screen, &template);
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    pipe_resource_reference(&exa_priv->depth_stencil_tex, tex);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	break;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!private->pPixmap) {
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	private->pPixmap = pPixmap;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pPixmap->refcnt++;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!tex) {
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* First call to make sure we have a pixmap private */
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	exaMoveInPixmap(private->pPixmap);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	xorg_exa_set_shared_usage(private->pPixmap);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pScreen->ModifyPixmapHeader(private->pPixmap, 0, 0, 0, 0, 0, NULL);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Second call to make sure texture has valid contents */
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	exaMoveInPixmap(private->pPixmap);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tex = xorg_exa_get_texture(private->pPixmap);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!tex)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	FatalError("NO TEXTURE IN DRI2\n");
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    memset(&whandle, 0, sizeof(whandle));
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    whandle.type = DRM_API_HANDLE_TYPE_SHARED;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->screen->resource_get_handle(ms->screen, tex, &whandle);
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->name = whandle.handle;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->pitch = whandle.stride;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->cpp = 4;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->driverPrivate = private;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->flags = 0; /* not tiled */
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION == 2
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* ABI forwards/backwards compatibility */
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (set_format_in_do_create_buffer)
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	((DRI2Buffer2Ptr)buffer)->format = 0;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif DRI2INFOREC_VERSION >= 3
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->format = 0;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    private->tex = tex;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return TRUE;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_do_destroy_buffer(DrawablePtr pDraw, DRI2BufferPtr buffer)
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ScreenPtr pScreen = pDraw->pScreen;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(pScrn);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    BufferPrivatePtr private = buffer->driverPrivate;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct exa_pixmap_priv *exa_priv = exaGetPixmapDriverPrivate(private->pPixmap);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pipe_resource_reference(&private->tex, NULL);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->screen->fence_reference(ms->screen, &private->fence, NULL);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    pipe_resource_reference(&exa_priv->depth_stencil_tex, NULL);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (*pScreen->DestroyPixmap)(private->pPixmap);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION >= 2
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic DRI2Buffer2Ptr
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, unsigned int format)
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DRI2Buffer2Ptr buffer;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    BufferPrivatePtr private;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer = calloc(1, sizeof *buffer);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!buffer)
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return NULL;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    private = calloc(1, sizeof *private);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!private) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	goto fail;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->attachment = attachment;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffer->driverPrivate = private;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* So far it is safe to downcast a DRI2Buffer2Ptr to DRI2BufferPtr */
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (dri2_do_create_buffer(pDraw, (DRI2BufferPtr)buffer, format))
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return buffer;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(private);
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail:
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(buffer);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return NULL;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer)
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* So far it is safe to downcast a DRI2Buffer2Ptr to DRI2BufferPtr */
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2_do_destroy_buffer(pDraw, (DRI2BufferPtr)buffer);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(buffer->driverPrivate);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(buffer);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* DRI2INFOREC_VERSION >= 2 */
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION <= 2
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic DRI2BufferPtr
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_buffers(DrawablePtr pDraw, unsigned int *attachments, int count)
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    BufferPrivatePtr privates;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DRI2BufferPtr buffers;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int i;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    buffers = calloc(count, sizeof *buffers);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!buffers)
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	goto fail_buffers;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    privates = calloc(count, sizeof *privates);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!privates)
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	goto fail_privates;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i = 0; i < count; i++) {
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffers[i].attachment = attachments[i];
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffers[i].driverPrivate = &privates[i];
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!dri2_do_create_buffer(pDraw, &buffers[i], 0))
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    goto fail;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return buffers;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail:
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(privates);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail_privates:
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    free(buffers);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail_buffers:
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return NULL;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_buffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int i;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    for (i = 0; i < count; i++) {
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dri2_do_destroy_buffer(pDraw, &buffers[i]);
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (buffers) {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(buffers[0].driverPrivate);
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(buffers);
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* DRI2INFOREC_VERSION <= 2 */
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_copy_region(DrawablePtr pDraw, RegionPtr pRegion,
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 DRI2BufferPtr pDestBuffer, DRI2BufferPtr pSrcBuffer)
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ScreenPtr pScreen = pDraw->pScreen;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(pScrn);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    BufferPrivatePtr dst_priv = pDestBuffer->driverPrivate;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    BufferPrivatePtr src_priv = pSrcBuffer->driverPrivate;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DrawablePtr src_draw;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DrawablePtr dst_draw;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GCPtr gc;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    RegionPtr copy_clip;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Bool save_accel;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    CustomizerPtr cust = ms->cust;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /*
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * In driCreateBuffers we dewrap windows into the
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * backing pixmaps in order to get to the texture.
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * We need to use the real drawable in CopyArea
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * so that cliprects and offsets are correct.
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    src_draw = (pSrcBuffer->attachment == DRI2BufferFrontLeft) ? pDraw :
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       &src_priv->pPixmap->drawable;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dst_draw = (pDestBuffer->attachment == DRI2BufferFrontLeft) ? pDraw :
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       &dst_priv->pPixmap->drawable;
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /*
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * The clients implements glXWaitX with a copy front to fake and then
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * waiting on the server to signal its completion of it. While
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * glXWaitGL is a client side flush and a copy from fake to front.
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * This is how it is done in the DRI2 protocol, how ever depending
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * which type of drawables the server does things a bit differently
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * then what the protocol says as the fake and front are the same.
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     *
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * for pixmaps glXWaitX is a server flush.
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * for pixmaps glXWaitGL is a client flush.
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * for windows glXWaitX is a copy from front to fake then a server flush.
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * for windows glXWaitGL is a client flush then a copy from fake to front.
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     *
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * XXX in the windows case this code always flushes but that isn't a
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * must in the glXWaitGL case but we don't know if this is a glXWaitGL
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * or a glFlush/glFinish call.
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (dst_priv->pPixmap == src_priv->pPixmap) {
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* pixmap glXWaitX */
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pSrcBuffer->attachment == DRI2BufferFrontLeft &&
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    pDestBuffer->attachment == DRI2BufferFakeFrontLeft) {
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ms->ctx->flush(ms->ctx, NULL);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* pixmap glXWaitGL */
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pDestBuffer->attachment == DRI2BufferFrontLeft &&
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    pSrcBuffer->attachment == DRI2BufferFakeFrontLeft) {
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"copying between the same pixmap\n");
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    gc = GetScratchGC(pDraw->depth, pScreen);
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    copy_clip = REGION_CREATE(pScreen, NULL, 0);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    REGION_COPY(pScreen, copy_clip, pRegion);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (*gc->funcs->ChangeClip) (gc, CT_REGION, copy_clip, 0);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ValidateGC(dst_draw, gc);
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* If this is a full buffer swap, throttle on the previous one */
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (ms->swapThrottling &&
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dst_priv->fence && REGION_NUM_RECTS(pRegion) == 1) {
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	BoxPtr extents = REGION_EXTENTS(pScreen, pRegion);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (extents->x1 == 0 && extents->y1 == 0 &&
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    extents->x2 == pDraw->width && extents->y2 == pDraw->height) {
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ms->screen->fence_finish(ms->screen, dst_priv->fence,
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     PIPE_TIMEOUT_INFINITE);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ms->screen->fence_reference(ms->screen, &dst_priv->fence, NULL);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* Try to make sure the blit will be accelerated */
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    save_accel = ms->exa->accel;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->exa->accel = TRUE;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (pSrcBuffer->attachment != DRI2BufferFrontLeft) {
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* In case it won't be though, make sure the GPU copy contents of the
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * source pixmap will be used for the software fallback - presumably the
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * client modified them before calling in here.
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	exaMoveInPixmap(src_priv->pPixmap);
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	DamageRegionAppend(src_draw, pRegion);
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	DamageRegionProcessPending(src_draw);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (cust && cust->winsys_context_throttle)
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       cust->winsys_context_throttle(cust, ms->ctx, THROTTLE_SWAP);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (*gc->ops->CopyArea)(src_draw, dst_draw, gc,
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 0, 0, pDraw->width, pDraw->height, 0, 0);
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->exa->accel = save_accel;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    FreeScratchGC(gc);
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->ctx->flush(ms->ctx,
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (pDestBuffer->attachment == DRI2BufferFrontLeft
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    && ms->swapThrottling) ?
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   &dst_priv->fence : NULL);
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (cust && cust->winsys_context_throttle)
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       cust->winsys_context_throttle(cust, ms->ctx, THROTTLE_RENDER);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_dri2_init(ScreenPtr pScreen)
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    modesettingPtr ms = modesettingPTR(pScrn);
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DRI2InfoRec dri2info;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION >= 2
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int major, minor;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (xf86LoaderCheckSymbol("DRI2Version")) {
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	DRI2Version(&major, &minor);
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    } else {
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Assume version 1.0 */
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	major = 1;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	minor = 0;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.version = min(DRI2INFOREC_VERSION, 3);
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.fd = ms->fd;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.driverName = pScrn->driverName;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.deviceName = "/dev/dri/card0"; /* FIXME */
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION >= 2
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.CreateBuffer = dri2_create_buffer;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.DestroyBuffer = dri2_destroy_buffer;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* For X servers in the 1.6.x series there where two DRI2 version.
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * This allows us to build one binary that works on both servers.
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     */
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION == 2
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (minor == 0) {
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	set_format_in_do_create_buffer = FALSE;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dri2info.CreateBuffers = dri2_create_buffers;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dri2info.DestroyBuffers = dri2_destroy_buffers;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    } else
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	set_format_in_do_create_buffer = FALSE;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* For version 1 set these unconditionaly. */
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2INFOREC_VERSION == 1
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.CreateBuffers = dri2_create_buffers;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.DestroyBuffers = dri2_destroy_buffers;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.CopyRegion = dri2_copy_region;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    dri2info.Wait = NULL;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->d_depth_bits_last =
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ms->screen->is_format_supported(ms->screen, PIPE_FORMAT_Z24X8_UNORM,
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 PIPE_TEXTURE_2D,
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 0,
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         PIPE_BIND_DEPTH_STENCIL);
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ms->ds_depth_bits_last =
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ms->screen->is_format_supported(ms->screen, PIPE_FORMAT_Z24_UNORM_S8_UINT,
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 PIPE_TEXTURE_2D,
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 0,
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         PIPE_BIND_DEPTH_STENCIL);
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return DRI2ScreenInit(pScreen, &dri2info);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_dri2_close(ScreenPtr pScreen)
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DRI2CloseScreen(pScreen);
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vim: set sw=4 ts=8 sts=4: */
474