1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.9 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009, VMware, Inc. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 LunarG Inc. 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keithw@vmware.com> 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Jakob Bornecrantz <wallbraker@gmail.com> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Chia-I Wu <olv@lunarg.com> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/drm_driver.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri_screen.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri_context.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri_drawable.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri2_buffer.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DRI2 flush extension. 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_flush_drawable(__DRIdrawable *dPriv) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_context *ctx = dri_get_current(dPriv->driScreenPriv); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_drawable *drawable = dri_drawable(dPriv); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *ptex = drawable->textures[ST_ATTACHMENT_BACK_LEFT]; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx) { 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ptex && ctx->pp && drawable->textures[ST_ATTACHMENT_DEPTH_STENCIL]) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pp_run(ctx->pp, ptex, ptex, drawable->textures[ST_ATTACHMENT_DEPTH_STENCIL]); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->st->flush(ctx->st, 0, NULL); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_invalidate_drawable(__DRIdrawable *dPriv) 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_drawable *drawable = dri_drawable(dPriv); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2InvalidateDrawable(dPriv); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->dPriv->lastStamp = drawable->dPriv->dri2.stamp; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_atomic_inc(&drawable->base.stamp); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const __DRI2flushExtension dri2FlushExtension = { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_flush_drawable, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_invalidate_drawable, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Retrieve __DRIbuffer from the DRI loader. 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIbuffer * 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_drawable_get_buffers(struct dri_drawable *drawable, 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const enum st_attachment_type *statts, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *count) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIdrawable *dri_drawable = drawable->dPriv; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct __DRIdri2LoaderExtensionRec *loader = drawable->sPriv->dri2.loader; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean with_format; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIbuffer *buffers; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_buffers; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned attachments[10]; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_attachments, i; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(loader); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org with_format = dri_with_format(drawable->sPriv); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_attachments = 0; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for Xserver 1.6.0 (DRI2 version 1) we always need to ask for the front */ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!with_format) 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attachments[num_attachments++] = __DRI_BUFFER_FRONT_LEFT; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < *count; i++) { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bind; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int att, depth; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_drawable_get_format(drawable, statts[i], &format, &bind); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format == PIPE_FORMAT_NONE) 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (statts[i]) { 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ST_ATTACHMENT_FRONT_LEFT: 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* already added */ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!with_format) 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_FRONT_LEFT; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ST_ATTACHMENT_BACK_LEFT: 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_BACK_LEFT; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ST_ATTACHMENT_FRONT_RIGHT: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_FRONT_RIGHT; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ST_ATTACHMENT_BACK_RIGHT: 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_BACK_RIGHT; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ST_ATTACHMENT_DEPTH_STENCIL: 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_DEPTH_STENCIL; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = -1; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In this switch statement we must support all formats that 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * may occur as the stvis->color_format or 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stvis->depth_stencil_format. 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(format) { 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_UNORM: 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 32; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8X8_UNORM: 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 24; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B5G6R5_UNORM: 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 16; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z16_UNORM: 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_DEPTH; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 16; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24X8_UNORM: 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8Z24_UNORM: 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_DEPTH; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 24; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24_UNORM_S8_UINT: 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT_Z24_UNORM: 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 32; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_UNORM: 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att = __DRI_BUFFER_DEPTH; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 32; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = util_format_get_blocksizebits(format); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"Unexpected format in dri2_drawable_get_buffers()"); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (att >= 0) { 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attachments[num_attachments++] = att; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (with_format) { 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attachments[num_attachments++] = depth; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (with_format) { 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_attachments /= 2; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers = loader->getBuffersWithFormat(dri_drawable, 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri_drawable->w, &dri_drawable->h, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attachments, num_attachments, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &num_buffers, dri_drawable->loaderPrivate); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers = loader->getBuffers(dri_drawable, 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri_drawable->w, &dri_drawable->h, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attachments, num_attachments, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &num_buffers, dri_drawable->loaderPrivate); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buffers) 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *count = num_buffers; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return buffers; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Process __DRIbuffer and convert them into pipe_resources. 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_drawable_process_buffers(struct dri_drawable *drawable, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIbuffer *buffers, unsigned count) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_screen *screen = dri_screen(drawable->sPriv); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIdrawable *dri_drawable = drawable->dPriv; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templ; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle whandle; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean have_depth = FALSE; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, bind; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (drawable->old_num == count && 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->old_w == dri_drawable->w && 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->old_h == dri_drawable->h && 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcmp(drawable->old, buffers, sizeof(__DRIbuffer) * count) == 0) 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ST_ATTACHMENT_COUNT; i++) 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&drawable->textures[i], NULL); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templ, 0, sizeof(templ)); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.target = screen->target; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.last_level = 0; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.width0 = dri_drawable->w; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.height0 = dri_drawable->h; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.depth0 = 1; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.array_size = 1; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&whandle, 0, sizeof(whandle)); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIbuffer *buf = &buffers[i]; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum st_attachment_type statt; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (buf->attachment) { 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_FRONT_LEFT: 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!screen->auto_fake_front) { 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org statt = ST_ATTACHMENT_INVALID; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fallthrough */ 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_FAKE_FRONT_LEFT: 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org statt = ST_ATTACHMENT_FRONT_LEFT; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_BACK_LEFT: 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org statt = ST_ATTACHMENT_BACK_LEFT; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_DEPTH: 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_DEPTH_STENCIL: 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_STENCIL: 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use only the first depth/stencil buffer */ 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!have_depth) { 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org have_depth = TRUE; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org statt = ST_ATTACHMENT_DEPTH_STENCIL; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org statt = ST_ATTACHMENT_INVALID; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org statt = ST_ATTACHMENT_INVALID; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_drawable_get_format(drawable, statt, &format, &bind); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (statt == ST_ATTACHMENT_INVALID || format == PIPE_FORMAT_NONE) 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = format; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.bind = bind; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.handle = buf->name; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.stride = buf->pitch; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->textures[statt] = 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.screen->resource_from_handle(screen->base.screen, 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &templ, &whandle); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->old_num = count; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->old_w = dri_drawable->w; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->old_h = dri_drawable->h; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(drawable->old, buffers, sizeof(__DRIbuffer) * count); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIbuffer * 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_allocate_buffer(__DRIscreen *sPriv, 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned attachment, unsigned format, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, int height) 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_screen *screen = dri_screen(sPriv); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_buffer *buffer; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templ; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format pf; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bind = 0; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle whandle; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attachment) { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_FRONT_LEFT: 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_FAKE_FRONT_LEFT: 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_BACK_LEFT: 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_DEPTH: 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_DEPTH_STENCIL: 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_BUFFER_STENCIL: 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* because we get the handle and stride */ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_SHARED; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B8G8R8A8_UNORM; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 24: 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B8G8R8X8_UNORM; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_Z16_UNORM; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer = CALLOC_STRUCT(dri2_buffer); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buffer) 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templ, 0, sizeof(templ)); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.bind = bind; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = pf; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.target = PIPE_TEXTURE_2D; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.last_level = 0; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.width0 = width; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.height0 = height; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.depth0 = 1; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.array_size = 1; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->resource = 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.screen->resource_create(screen->base.screen, &templ); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buffer->resource) { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(buffer); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&whandle, 0, sizeof(whandle)); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.type = DRM_API_HANDLE_TYPE_SHARED; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->base.screen->resource_get_handle(screen->base.screen, 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->resource, &whandle); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->base.attachment = attachment; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->base.name = whandle.handle; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->base.cpp = util_format_get_blocksize(pf); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->base.pitch = whandle.stride; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &buffer->base; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_release_buffer(__DRIscreen *sPriv, __DRIbuffer *bPriv) 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_buffer *buffer = dri2_buffer(bPriv); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&buffer->resource, NULL); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(buffer); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Backend functions for st_framebuffer interface. 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_allocate_textures(struct dri_drawable *drawable, 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const enum st_attachment_type *statts, 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count) 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIbuffer *buffers; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_buffers = count; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffers = dri2_drawable_get_buffers(drawable, statts, &num_buffers); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buffers) 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drawable_process_buffers(drawable, buffers, num_buffers); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_flush_frontbuffer(struct dri_drawable *drawable, 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum st_attachment_type statt) 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIdrawable *dri_drawable = drawable->dPriv; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct __DRIdri2LoaderExtensionRec *loader = drawable->sPriv->dri2.loader; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (loader->flushFrontBuffer == NULL) 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (statt == ST_ATTACHMENT_FRONT_LEFT) { 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loader->flushFrontBuffer(dri_drawable, dri_drawable->loaderPrivate); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_update_tex_buffer(struct dri_drawable *drawable, 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_context *ctx, 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res) 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op */ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIimage * 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_lookup_egl_image(struct dri_screen *screen, void *handle) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimageLookupExtension *loader = screen->sPriv->dri2.image; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *img; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!loader->lookupEGLImage) 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = loader->lookupEGLImage(screen->sPriv, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle, screen->sPriv->loaderPrivate); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return img; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIimage * 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_from_name(__DRIscreen *_screen, 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, int height, int format, 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name, int pitch, void *loaderPrivate) 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_screen *screen = dri_screen(_screen); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *img; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templ; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle whandle; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tex_usage; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format pf; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_RGB565: 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B5G6R5_UNORM; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_XRGB8888: 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B8G8R8X8_UNORM; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_ARGB8888: 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B8G8R8A8_UNORM; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_ABGR8888: 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_R8G8B8A8_UNORM; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_NONE; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pf == PIPE_FORMAT_NONE) 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = CALLOC_STRUCT(__DRIimageRec); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!img) 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templ, 0, sizeof(templ)); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.bind = tex_usage; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = pf; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.target = screen->target; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.last_level = 0; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.width0 = width; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.height0 = height; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.depth0 = 1; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.array_size = 1; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&whandle, 0, sizeof(whandle)); 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.handle = name; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.stride = pitch * util_format_get_blocksize(pf); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->texture = screen->base.screen->resource_from_handle(screen->base.screen, 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &templ, &whandle); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!img->texture) { 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(img); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->level = 0; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->layer = 0; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->dri_format = format; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->loader_private = loaderPrivate; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return img; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIimage * 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_from_renderbuffer(__DRIcontext *context, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int renderbuffer, void *loaderPrivate) 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_context *ctx = dri_context(context); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->st->get_resource_for_egl_image) 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO */ 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIimage * 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image(__DRIscreen *_screen, 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, int height, int format, 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int use, void *loaderPrivate) 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_screen *screen = dri_screen(_screen); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *img; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templ; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned tex_usage; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format pf; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use & __DRI_IMAGE_USE_SCANOUT) 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_usage |= PIPE_BIND_SCANOUT; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use & __DRI_IMAGE_USE_SHARE) 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_usage |= PIPE_BIND_SHARED; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use & __DRI_IMAGE_USE_CURSOR) { 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width != 64 || height != 64) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_usage |= PIPE_BIND_CURSOR; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_RGB565: 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B5G6R5_UNORM; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_XRGB8888: 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B8G8R8X8_UNORM; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_ARGB8888: 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_B8G8R8A8_UNORM; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FORMAT_ABGR8888: 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_R8G8B8A8_UNORM; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pf = PIPE_FORMAT_NONE; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pf == PIPE_FORMAT_NONE) 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = CALLOC_STRUCT(__DRIimageRec); 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!img) 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templ, 0, sizeof(templ)); 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.bind = tex_usage; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.format = pf; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.target = PIPE_TEXTURE_2D; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.last_level = 0; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.width0 = width; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.height0 = height; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.depth0 = 1; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templ.array_size = 1; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->texture = screen->base.screen->resource_create(screen->base.screen, &templ); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!img->texture) { 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(img); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->level = 0; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->layer = 0; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->dri_format = format; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->dri_components = 0; 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->loader_private = loaderPrivate; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return img; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_query_image(__DRIimage *image, int attrib, int *value) 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle whandle; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&whandle, 0, sizeof(whandle)); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attrib) { 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_ATTRIB_STRIDE: 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->texture->screen->resource_get_handle(image->texture->screen, 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->texture, &whandle); 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = whandle.stride; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_ATTRIB_HANDLE: 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.type = DRM_API_HANDLE_TYPE_KMS; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->texture->screen->resource_get_handle(image->texture->screen, 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->texture, &whandle); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = whandle.handle; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_ATTRIB_NAME: 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.type = DRM_API_HANDLE_TYPE_SHARED; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->texture->screen->resource_get_handle(image->texture->screen, 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->texture, &whandle); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = whandle.handle; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_ATTRIB_FORMAT: 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = image->dri_format; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_ATTRIB_WIDTH: 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = image->texture->width0; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_ATTRIB_HEIGHT: 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = image->texture->height0; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_ATTRIB_COMPONENTS: 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->dri_components == 0) 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = image->dri_components; 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIimage * 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_dup_image(__DRIimage *image, void *loaderPrivate) 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *img; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = CALLOC_STRUCT(__DRIimageRec); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!img) 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->texture = NULL; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&img->texture, image->texture); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->level = image->level; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->layer = image->layer; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This should be 0 for sub images, but dup is also used for base images. */ 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->dri_components = image->dri_components; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->loader_private = loaderPrivate; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return img; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_validate_usage(__DRIimage *image, unsigned int use) 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Gallium drivers are bad at adding usages to the resources 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * once opened again in another process, which is the main use 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * case for this, so we have to lie. 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image != NULL) 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIimage * 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_from_names(__DRIscreen *screen, int width, int height, int format, 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *names, int num_names, int *strides, int *offsets, 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *loaderPrivate) 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *img; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int stride, dri_components; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_names != 1) 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offsets[0] != 0) 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(format) { 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FOURCC_RGB565: 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_RGB565; 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_components = __DRI_IMAGE_COMPONENTS_RGB; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FOURCC_ARGB8888: 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_ARGB8888; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_components = __DRI_IMAGE_COMPONENTS_RGBA; 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FOURCC_XRGB8888: 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_XRGB8888; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_components = __DRI_IMAGE_COMPONENTS_RGB; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FOURCC_ABGR8888: 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_ABGR8888; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_components = __DRI_IMAGE_COMPONENTS_RGBA; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_IMAGE_FOURCC_XBGR8888: 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_XBGR8888; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_components = __DRI_IMAGE_COMPONENTS_RGB; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Strides are in bytes not pixels. */ 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride = strides[0] /4; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = dri2_create_image_from_name(screen, width, height, format, 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org names[0], stride, loaderPrivate); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img == NULL) 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->dri_components = dri_components; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return img; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __DRIimage * 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate) 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *img; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (plane != 0) 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->dri_components == 0) 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = dri2_dup_image(image, loaderPrivate); 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img == NULL) 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* set this to 0 for sub images. */ 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->dri_components = 0; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return img; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_image(__DRIimage *img) 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&img->texture, NULL); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(img); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct __DRIimageExtensionRec dri2ImageExtension = { 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE, 5 }, 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_create_image_from_name, 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_create_image_from_renderbuffer, 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_destroy_image, 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_create_image, 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_query_image, 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dup_image, 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_validate_usage, 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_from_names, 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_from_planar, 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Backend function init_screen. 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const __DRIextension *dri_screen_extensions[] = { 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &driTexBufferExtension.base, 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2FlushExtension.base, 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2ImageExtension.base, 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2ConfigQueryExtension.base, 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const __DRIextension *dri_screen_extensions_throttle[] = { 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &driTexBufferExtension.base, 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2FlushExtension.base, 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2ImageExtension.base, 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2ConfigQueryExtension.base, 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2ThrottleExtension.base, 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the driver specific part of the createNewScreen entry point. 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Returns the struct gl_config supported by this driver. 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const __DRIconfig ** 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_init_screen(__DRIscreen * sPriv) 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __DRIconfig **configs; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_screen *screen; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *pscreen; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct drm_conf_ret *throttle_ret = NULL; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen = CALLOC_STRUCT(dri_screen); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!screen) 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->sPriv = sPriv; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->fd = sPriv->fd; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sPriv->driverPrivate = (void *)screen; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pscreen = driver_descriptor.create_screen(screen->fd); 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (driver_descriptor.configuration) 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org throttle_ret = driver_descriptor.configuration(DRM_CONF_THROTTLE); 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (throttle_ret && throttle_ret->val.val_int != -1) { 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sPriv->extensions = dri_screen_extensions_throttle; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->default_throttle_frames = throttle_ret->val.val_int; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sPriv->extensions = dri_screen_extensions; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dri_init_screen_helper checks pscreen for us */ 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org configs = dri_init_screen_helper(screen, pscreen, 32); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!configs) 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sPriv->api_mask = 0; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->st_api->profile_mask & ST_PROFILE_DEFAULT_MASK) 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sPriv->api_mask |= 1 << __DRI_API_OPENGL; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->st_api->profile_mask & ST_PROFILE_OPENGL_ES1_MASK) 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sPriv->api_mask |= 1 << __DRI_API_GLES; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->st_api->profile_mask & ST_PROFILE_OPENGL_ES2_MASK) 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sPriv->api_mask |= 1 << __DRI_API_GLES2; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->auto_fake_front = dri_with_format(sPriv); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->broken_invalidate = !sPriv->dri2.useInvalidate; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->lookup_egl_image = dri2_lookup_egl_image; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return configs; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail: 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_destroy_screen_helper(screen); 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(screen); 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_buffer(__DRIscreen * sPriv, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIdrawable * dPriv, 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_config * visual, boolean isPixmap) 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri_drawable *drawable = NULL; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri_create_buffer(sPriv, dPriv, visual, isPixmap)) 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable = dPriv->driverPrivate; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->allocate_textures = dri2_allocate_textures; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->flush_frontbuffer = dri2_flush_frontbuffer; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable->update_tex_buffer = dri2_update_tex_buffer; 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DRI driver virtual function table. 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DRI versions differ in their implementation of init_screen and swap_buffers. 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct __DriverAPIRec driDriverAPI = { 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .InitScreen = dri2_init_screen, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .DestroyScreen = dri_destroy_screen, 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .CreateContext = dri_create_context, 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .DestroyContext = dri_destroy_context, 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .CreateBuffer = dri2_create_buffer, 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .DestroyBuffer = dri_destroy_buffer, 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .MakeCurrent = dri_make_current, 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .UnbindContext = dri_unbind_context, 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .AllocateBuffer = dri2_allocate_buffer, 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .ReleaseBuffer = dri2_release_buffer, 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This is the table of extensions that the loader will dlsym() for. */ 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC const __DRIextension *__driDriverExtensions[] = { 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &driCoreExtension.base, 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &driDRI2Extension.base, 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vim: set sw=3 ts=8 sts=3 expandtab: */ 874