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