1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2010 Intel Corporation 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Kristian Høgsberg <krh@bitplanet.net> 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h> 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <limits.h> 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <dlfcn.h> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <fcntl.h> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <errno.h> 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86drm.h> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/gl.h> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/internal/dri_interface.h> 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/types.h> 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/stat.h> 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_dri2.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst __DRIuseInvalidateExtension use_invalidate = { 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_USE_INVALIDATE, 1 } 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLint dri2_to_egl_attribute_map[] = { 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_BUFFER_SIZE, /* __DRI_ATTRIB_BUFFER_SIZE */ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_LEVEL, /* __DRI_ATTRIB_LEVEL */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_RED_SIZE, /* __DRI_ATTRIB_RED_SIZE */ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_GREEN_SIZE, /* __DRI_ATTRIB_GREEN_SIZE */ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_BLUE_SIZE, /* __DRI_ATTRIB_BLUE_SIZE */ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_LUMINANCE_SIZE, /* __DRI_ATTRIB_LUMINANCE_SIZE */ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_ALPHA_SIZE, /* __DRI_ATTRIB_ALPHA_SIZE */ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_ALPHA_MASK_SIZE */ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_DEPTH_SIZE, /* __DRI_ATTRIB_DEPTH_SIZE */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_STENCIL_SIZE, /* __DRI_ATTRIB_STENCIL_SIZE */ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_ACCUM_RED_SIZE */ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_ACCUM_GREEN_SIZE */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_ACCUM_BLUE_SIZE */ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_ACCUM_ALPHA_SIZE */ 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_SAMPLE_BUFFERS, /* __DRI_ATTRIB_SAMPLE_BUFFERS */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_SAMPLES, /* __DRI_ATTRIB_SAMPLES */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_RENDER_TYPE, */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_CONFIG_CAVEAT */ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_CONFORMANT */ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_DOUBLE_BUFFER */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_STEREO */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_AUX_BUFFERS */ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_TRANSPARENT_TYPE */ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_TRANSPARENT_INDEX_VALUE */ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_TRANSPARENT_RED_VALUE */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_TRANSPARENT_GREEN_VALUE */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_TRANSPARENT_BLUE_VALUE */ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_FLOAT_MODE */ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_RED_MASK */ 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_GREEN_MASK */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_BLUE_MASK */ 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_ALPHA_MASK */ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_MAX_PBUFFER_WIDTH, /* __DRI_ATTRIB_MAX_PBUFFER_WIDTH */ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_MAX_PBUFFER_HEIGHT, /* __DRI_ATTRIB_MAX_PBUFFER_HEIGHT */ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_MAX_PBUFFER_PIXELS, /* __DRI_ATTRIB_MAX_PBUFFER_PIXELS */ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH */ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT */ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_VISUAL_SELECT_GROUP */ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_SWAP_METHOD */ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_MAX_SWAP_INTERVAL, /* __DRI_ATTRIB_MAX_SWAP_INTERVAL */ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_MIN_SWAP_INTERVAL, /* __DRI_ATTRIB_MIN_SWAP_INTERVAL */ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_BIND_TO_TEXTURE_RGB */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA */ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS */ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_Y_INVERTED_NOK, /* __DRI_ATTRIB_YINVERTED */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE */ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_match_config(const _EGLConfig *conf, const _EGLConfig *criteria) 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_eglCompareConfigs(conf, criteria, NULL, EGL_FALSE) != 0) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglMatchConfig(conf, criteria)) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dri2_egl_config * 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id, 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int depth, EGLint surface_type, const EGLint *attr_list, 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned int *rgba_masks) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_config *conf; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLConfig base; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int attrib, value, double_buffer; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint key, bind_to_texture_rgb, bind_to_texture_rgba; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int dri_masks[4] = { 0, 0, 0, 0 }; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLConfig *matching_config; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint num_configs = 0; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint config_id; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy = disp->DriverData; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglInitConfig(&base, disp, id); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = 0; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double_buffer = 0; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_to_texture_rgb = 0; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_to_texture_rgba = 0; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (dri2_dpy->core->indexConfigAttrib(dri_config, i++, &attrib, &value)) { 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attrib) { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_RENDER_TYPE: 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (value & __DRI_ATTRIB_RGBA_BIT) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = EGL_RGB_BUFFER; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (value & __DRI_ATTRIB_LUMINANCE_BIT) 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = EGL_LUMINANCE_BUFFER; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* not valid */; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglSetConfigKey(&base, EGL_COLOR_BUFFER_TYPE, value); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_CONFIG_CAVEAT: 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG) 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = EGL_NON_CONFORMANT_CONFIG; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (value & __DRI_ATTRIB_SLOW_BIT) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = EGL_SLOW_CONFIG; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = EGL_NONE; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglSetConfigKey(&base, EGL_CONFIG_CAVEAT, value); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_BIND_TO_TEXTURE_RGB: 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_to_texture_rgb = value; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA: 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind_to_texture_rgba = value; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_DOUBLE_BUFFER: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double_buffer = value; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_RED_MASK: 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_masks[0] = value; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_GREEN_MASK: 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_masks[1] = value; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_BLUE_MASK: 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_masks[2] = value; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_ATTRIB_ALPHA_MASK: 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_masks[3] = value; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key = dri2_to_egl_attribute_map[attrib]; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (key != 0) 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglSetConfigKey(&base, key, value); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attr_list) 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; attr_list[i] != EGL_NONE; i += 2) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglSetConfigKey(&base, attr_list[i], attr_list[i+1]); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth > 0 && depth != base.BufferSize) 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rgba_masks && memcmp(rgba_masks, dri_masks, sizeof(dri_masks))) 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.NativeRenderable = EGL_TRUE; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.SurfaceType = surface_type; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surface_type & (EGL_PBUFFER_BIT | 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (disp->Extensions.NOK_texture_from_pixmap ? EGL_PIXMAP_BIT : 0))) { 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.BindToTextureRGB = bind_to_texture_rgb; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (base.AlphaSize > 0) 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.BindToTextureRGBA = bind_to_texture_rgba; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.RenderableType = disp->ClientAPIs; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.Conformant = disp->ClientAPIs; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglValidateConfig(&base, EGL_FALSE)) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "DRI2: failed to validate config %d", id); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config_id = base.ConfigID; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.ConfigID = EGL_DONT_CARE; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base.SurfaceType = EGL_DONT_CARE; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_configs = _eglFilterArray(disp->Configs, (void **) &matching_config, 1, 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (_EGLArrayForEach) dri2_match_config, &base); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_configs == 1) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf = (struct dri2_egl_config *) matching_config; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (double_buffer && !conf->dri_double_config) 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->dri_double_config = dri_config; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!double_buffer && !conf->dri_single_config) 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->dri_single_config = dri_config; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* a similar config type is already added (unlikely) => discard */ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (num_configs == 0) { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf = malloc(sizeof *conf); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (conf == NULL) 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&conf->base, &base, sizeof base); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (double_buffer) { 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->dri_double_config = dri_config; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->dri_single_config = NULL; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->dri_single_config = dri_config; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->dri_double_config = NULL; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->base.SurfaceType = 0; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->base.ConfigID = config_id; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLinkConfig(&conf->base); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (double_buffer) { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type &= ~EGL_PIXMAP_BIT; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->swap_available) { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->base.MinSwapInterval = 0; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->base.MaxSwapInterval = 1000; /* XXX arbitrary value */ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->base.SurfaceType |= surface_type; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return conf; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__DRIimage * 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data) 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *disp = data; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_image *dri2_img; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLImage *img; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) screen; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = _eglLookupImage(image, disp); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img == NULL) { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "dri2_lookup_egl_image"); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img = dri2_egl_image(image); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_img->dri_image; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst __DRIimageLookupExtension image_lookup_extension = { 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE_LOOKUP, 1 }, 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_lookup_egl_image 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char dri_driver_path[] = DEFAULT_DRIVER_DIR; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dri2_extension_match { 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int version; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int offset; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match dri2_driver_extensions[] = { 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_CORE, 1, offsetof(struct dri2_egl_display, core) }, 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_DRI2, 2, offsetof(struct dri2_egl_display, dri2) }, 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL, 0, 0 } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match dri2_core_extensions[] = { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI2_FLUSH, 1, offsetof(struct dri2_egl_display, flush) }, 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_TEX_BUFFER, 2, offsetof(struct dri2_egl_display, tex_buffer) }, 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) }, 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL, 0, 0 } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match swrast_driver_extensions[] = { 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_CORE, 1, offsetof(struct dri2_egl_display, core) }, 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_SWRAST, 2, offsetof(struct dri2_egl_display, swrast) }, 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL, 0, 0 } 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match swrast_core_extensions[] = { 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_TEX_BUFFER, 2, offsetof(struct dri2_egl_display, tex_buffer) }, 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL, 0, 0 } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_bind_extensions(struct dri2_egl_display *dri2_dpy, 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_extension_match *matches, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __DRIextension **extensions) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, j, ret = EGL_TRUE; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *field; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; extensions[i]; i++) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "DRI2: found extension `%s'", extensions[i]->name); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; matches[j].name; j++) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (strcmp(extensions[i]->name, matches[j].name) == 0 && 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extensions[i]->version >= matches[j].version) { 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org field = ((char *) dri2_dpy + matches[j].offset); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *(const __DRIextension **) field = extensions[i]; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_INFO, "DRI2: found extension %s version %d", 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extensions[i]->name, extensions[i]->version); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; matches[j].name; j++) { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org field = ((char *) dri2_dpy + matches[j].offset); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*(const __DRIextension **) field == NULL) { 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_FATAL, "DRI2: did not find extension %s version %d", 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matches[j].name, matches[j].version); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = EGL_FALSE; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const __DRIextension ** 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_open_driver(_EGLDisplay *disp) 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = disp->DriverData; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __DRIextension **extensions; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char path[PATH_MAX], *search_paths, *p, *next, *end; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org search_paths = NULL; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (geteuid() == getuid()) { 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org search_paths = getenv("LIBGL_DRIVERS_PATH"); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (search_paths == NULL) 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org search_paths = DEFAULT_DRIVER_DIR; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->driver = NULL; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org end = search_paths + strlen(search_paths); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (p = search_paths; p < end && dri2_dpy->driver == NULL; p = next + 1) { 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int len; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = strchr(p, ':'); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (next == NULL) 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = end; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org len = next - p; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if GLX_USE_TLS 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org snprintf(path, sizeof path, 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%.*s/tls/%s_dri.so", len, p, dri2_dpy->driver_name); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->driver == NULL) { 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org snprintf(path, sizeof path, 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%.*s/%s_dri.so", len, p, dri2_dpy->driver_name); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->driver == NULL) 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "failed to open %s: %s\n", path, dlerror()); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->driver == NULL) { 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "DRI2: failed to open %s (search paths %s)", 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->driver_name, search_paths); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "DRI2: dlopen(%s)", path); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extensions = dlsym(dri2_dpy->driver, __DRI_DRIVER_EXTENSIONS); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (extensions == NULL) { 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "DRI2: driver exports no extensions (%s)", dlerror()); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(dri2_dpy->driver); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return extensions; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_load_driver(_EGLDisplay *disp) 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = disp->DriverData; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __DRIextension **extensions; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extensions = dri2_open_driver(disp); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!extensions) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_bind_extensions(dri2_dpy, dri2_driver_extensions, extensions)) { 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(dri2_dpy->driver); 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_load_driver_swrast(_EGLDisplay *disp) 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = disp->DriverData; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __DRIextension **extensions; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->driver_name = "swrast"; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extensions = dri2_open_driver(disp); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!extensions) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_bind_extensions(dri2_dpy, swrast_driver_extensions, extensions)) { 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(dri2_dpy->driver); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_setup_screen(_EGLDisplay *disp) 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int api_mask; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api_mask = dri2_dpy->dri2->getAPIMask(dri2_dpy->dri_screen); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->swrast); 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api_mask = 1 << __DRI_API_OPENGL | 1 << __DRI_API_GLES | 1 << __DRI_API_GLES2; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->ClientAPIs = 0; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (api_mask & (1 <<__DRI_API_OPENGL)) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->ClientAPIs |= EGL_OPENGL_BIT; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (api_mask & (1 <<__DRI_API_GLES)) 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->ClientAPIs |= EGL_OPENGL_ES_BIT; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (api_mask & (1 << __DRI_API_GLES2)) 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->ClientAPIs |= EGL_OPENGL_ES2_BIT; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->dri2 || dri2_dpy->swrast); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.KHR_surfaceless_context = EGL_TRUE; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2 && dri2_dpy->dri2->base.version >= 3) { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.KHR_create_context = EGL_TRUE; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->robustness) 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.EXT_create_context_robustness = EGL_TRUE; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->image) { 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.MESA_drm_image = EGL_TRUE; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.KHR_image_base = EGL_TRUE; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Extensions.KHR_gl_renderbuffer_image = EGL_TRUE; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_screen(_EGLDisplay *disp) 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __DRIextension **extensions; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy = disp->DriverData; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri_screen = 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, dri2_dpy->extensions, 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2_dpy->driver_configs, disp); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->swrast); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri_screen = 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swrast->createNewScreen(0, dri2_dpy->extensions, 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2_dpy->driver_configs, disp); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri_screen == NULL) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to create dri screen"); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->own_dri_screen = 1; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org extensions = dri2_dpy->core->getExtensions(dri2_dpy->dri_screen); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_bind_extensions(dri2_dpy, dri2_core_extensions, extensions)) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_dri_screen; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; extensions[i]; i++) { 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0) { 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->robustness = (__DRIrobustnessExtension *) extensions[i]; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->swrast); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_bind_extensions(dri2_dpy, swrast_core_extensions, extensions)) 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_dri_screen; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_setup_screen(disp); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_dri_screen: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglInitialize(), GLX_drv->API.Initialize(). 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_initialize(_EGLDriver *drv, _EGLDisplay *disp) 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* not until swrast_dri is supported */ 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->Options.UseFallback) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (disp->Platform) { 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_X11_PLATFORM 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_X11: 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->Options.TestOnly) 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_initialize_x11(drv, disp); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBUDEV 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_DRM_PLATFORM 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_DRM: 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->Options.TestOnly) 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_initialize_drm(drv, disp); 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_WAYLAND: 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->Options.TestOnly) 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_initialize_wayland(drv, disp); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_ANDROID_PLATFORM 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_ANDROID: 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->Options.TestOnly) 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_initialize_android(drv, disp); 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglTerminate(), drv->API.Terminate(). 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_terminate(_EGLDriver *drv, _EGLDisplay *disp) 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglReleaseDisplayResources(drv, disp); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglCleanupDisplay(disp); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->own_dri_screen) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->fd) 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org close(dri2_dpy->fd); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->driver) 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(dri2_dpy->driver); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->device_name) 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_dpy->device_name); 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->PlatformDisplay == NULL) { 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (disp->Platform) { 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_X11_PLATFORM 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_X11: 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xcb_disconnect(dri2_dpy->conn); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_DRM_PLATFORM 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_DRM: 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->own_device) { 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gbm_device_destroy(&dri2_dpy->gbm_dri->base.base); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_dpy); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->DriverData = NULL; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the error code after a call to 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dri2_egl_display::dri2::createContextAttribs. 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_context_attribs_error(int dri_error) 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint egl_error; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dri_error) { 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_CTX_ERROR_SUCCESS: 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_CTX_ERROR_NO_MEMORY: 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_error = EGL_BAD_ALLOC; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the EGL_KHR_create_context spec, section "Errors": 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * If <config> does not support a client API context compatible 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with the requested API major and minor version, [...] context flags, 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and context reset notification behavior (for client API types where 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * these attributes are supported), then an EGL_BAD_MATCH error is 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * generated. 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * If an OpenGL ES context is requested and the values for 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attributes EGL_CONTEXT_MAJOR_VERSION_KHR and 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EGL_CONTEXT_MINOR_VERSION_KHR specify an OpenGL ES version that 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is not defined, than an EGL_BAD_MATCH error is generated. 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * If an OpenGL context is requested, the requested version is 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * greater than 3.2, and the value for attribute 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR has no bits set; has any 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bits set other than EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR and 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; has more than 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * one of these bits set; or if the implementation does not support 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the requested profile, then an EGL_BAD_MATCH error is generated. 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_CTX_ERROR_BAD_API: 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_CTX_ERROR_BAD_VERSION: 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_CTX_ERROR_BAD_FLAG: 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_error = EGL_BAD_MATCH; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the EGL_KHR_create_context spec, section "Errors": 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * If an attribute name or attribute value in <attrib_list> is not 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * recognized (including unrecognized bits in bitmask attributes), 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * then an EGL_BAD_ATTRIBUTE error is generated." 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE: 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case __DRI_CTX_ERROR_UNKNOWN_FLAG: 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_error = EGL_BAD_ATTRIBUTE; 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_error = EGL_BAD_MATCH; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(egl_error, "dri2_create_context"); 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglCreateContext(), drv->API.CreateContext(). 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLContext * 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf, 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLContext *share_list, const EGLint *attrib_list) 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_context *dri2_ctx; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_context *dri2_ctx_shared = dri2_egl_context(share_list); 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIcontext *shared = 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx_shared ? dri2_ctx_shared->dri_context : NULL; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_config *dri2_config = dri2_egl_config(conf); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const __DRIconfig *dri_config; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int api; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx = malloc(sizeof *dri2_ctx); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_ctx) { 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "eglCreateContext"); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglInitContext(&dri2_ctx->base, disp, conf, attrib_list)) 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dri2_ctx->base.ClientAPI) { 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_OPENGL_ES_API: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dri2_ctx->base.ClientMajorVersion) { 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api = __DRI_API_GLES; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api = __DRI_API_GLES2; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "eglCreateContext"); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_OPENGL_API: 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dri2_ctx->base.ClientMajorVersion >= 4 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || (dri2_ctx->base.ClientMajorVersion == 3 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && dri2_ctx->base.ClientMinorVersion >= 2)) 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && dri2_ctx->base.Profile == EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR) 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api = __DRI_API_OPENGL_CORE; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api = __DRI_API_OPENGL; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "eglCreateContext"); 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (conf != NULL) { 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The config chosen here isn't necessarily 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * used for surfaces later. 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A pixmap surface will use the single config. 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This opportunity depends on disabling the 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * doubleBufferMode check in 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * src/mesa/main/context.c:check_compatible() 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_config->dri_double_config) 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_config = dri2_config->dri_double_config; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_config = dri2_config->dri_single_config; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* EGL_WINDOW_BIT is set only when there is a dri_double_config. This 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * makes sure the back buffer will always be used. 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (conf->SurfaceType & EGL_WINDOW_BIT) 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx->base.WindowRenderBuffer = EGL_BACK_BUFFER; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_config = NULL; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2) { 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->dri2->base.version >= 3) { 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned error; 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_attribs = 0; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t ctx_attribs[8]; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = dri2_ctx->base.ClientMajorVersion; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = dri2_ctx->base.ClientMinorVersion; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_ctx->base.Flags != 0) { 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the implementation doesn't support the __DRI2_ROBUSTNESS 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * extension, don't even try to send it the robust-access flag. 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It may explode. Instead, generate the required EGL error here. 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((dri2_ctx->base.Flags & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) != 0 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !dri2_dpy->robustness) { 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_MATCH, "eglCreateContext"); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_FLAGS; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = dri2_ctx->base.Flags; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_ctx->base.ResetNotificationStrategy != EGL_NO_RESET_NOTIFICATION_KHR) { 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the implementation doesn't support the __DRI2_ROBUSTNESS 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * extension, don't even try to send it a reset strategy. It may 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * explode. Instead, generate the required EGL error here. 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_dpy->robustness) { 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_CONFIG, "eglCreateContext"); 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_RESET_STRATEGY; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs[num_attribs++] = __DRI_CTX_RESET_LOSE_CONTEXT; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(num_attribs <= ARRAY_SIZE(ctx_attribs)); 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx->dri_context = 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2->createContextAttribs(dri2_dpy->dri_screen, 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api, 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_config, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shared, 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_attribs / 2, 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx_attribs, 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org & error, 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx); 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_create_context_attribs_error(error); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx->dri_context = 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->dri2->createNewContextForAPI(dri2_dpy->dri_screen, 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api, 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_config, 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shared, 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dri2_dpy->swrast); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx->dri_context = 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->swrast->createNewContextForAPI(dri2_dpy->dri_screen, 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_config, 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shared, 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx); 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_ctx->dri_context) 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup; 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &dri2_ctx->base; 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup: 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_ctx); 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglDestroyContext(), drv->API.DestroyContext(). 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx) 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_eglPutContext(ctx)) { 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->destroyContext(dri2_ctx->dri_context); 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_ctx); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglMakeCurrent(), drv->API.MakeCurrent(). 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf, 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLSurface *rsurf, _EGLContext *ctx) 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_dsurf = dri2_egl_surface(dsurf); 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_rsurf = dri2_egl_surface(rsurf); 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLContext *old_ctx; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLSurface *old_dsurf, *old_rsurf; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIdrawable *ddraw, *rdraw; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIcontext *cctx; 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* make new bindings */ 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglBindContext(ctx, dsurf, rsurf, &old_ctx, &old_dsurf, &old_rsurf)) 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* flush before context switch */ 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old_ctx && dri2_drv->glFlush) 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->glFlush(); 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ddraw = (dri2_dsurf) ? dri2_dsurf->dri_drawable : NULL; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rdraw = (dri2_rsurf) ? dri2_rsurf->dri_drawable : NULL; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cctx = (dri2_ctx) ? dri2_ctx->dri_context : NULL; 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old_ctx) { 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->unbindContext(old_cctx); 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((cctx == NULL && ddraw == NULL && rdraw == NULL) || 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->core->bindContext(cctx, ddraw, rdraw)) { 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old_dsurf) 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroySurface(drv, disp, old_dsurf); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old_rsurf) 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroySurface(drv, disp, old_rsurf); 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old_ctx) 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroyContext(drv, disp, old_ctx); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* undo the previous _eglBindContext */ 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglBindContext(old_ctx, old_dsurf, old_rsurf, &ctx, &dsurf, &rsurf); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(&dri2_ctx->base == ctx && 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2_dsurf->base == dsurf && 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dri2_rsurf->base == rsurf); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglPutSurface(dsurf); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglPutSurface(rsurf); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglPutContext(ctx); 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglPutSurface(old_dsurf); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglPutSurface(old_rsurf); 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglPutContext(old_ctx); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from eglGetProcAddress() via drv->API.GetProcAddress(). 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLProc 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_get_proc_address(_EGLDriver *drv, const char *procname) 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_drv->get_proc_address(procname); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wait_client(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx) 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(ctx->DrawSurface); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: If EGL allows frontbuffer rendering for window surfaces, 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we need to copy fake to real here.*/ 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wait_native(_EGLDriver *drv, _EGLDisplay *disp, EGLint engine) 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) disp; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (engine != EGL_CORE_NATIVE_ENGINE) 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _eglError(EGL_BAD_PARAMETER, "eglWaitNative"); 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* glXWaitX(); */ 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_bind_tex_image(_EGLDriver *drv, 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer) 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_context *dri2_ctx; 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLContext *ctx; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint format, target; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx = _eglGetCurrentContext(); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx = dri2_egl_context(ctx); 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglBindTexImage(drv, disp, surf, buffer)) 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dri2_surf->base.TextureFormat) { 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_TEXTURE_RGB: 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_TEXTURE_FORMAT_RGB; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_TEXTURE_RGBA: 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_TEXTURE_FORMAT_RGBA; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dri2_surf->base.TextureTarget) { 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_TEXTURE_2D: 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GL_TEXTURE_2D; 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->tex_buffer->setTexBuffer2)(dri2_ctx->dri_context, 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target, format, 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->dri_drawable); 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_release_tex_image(_EGLDriver *drv, 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer) 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if __DRI_TEX_BUFFER_VERSION >= 3 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_context *dri2_ctx; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLContext *ctx; 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint target; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx = _eglGetCurrentContext(); 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_ctx = dri2_egl_context(ctx); 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglReleaseTexImage(drv, disp, surf, buffer)) 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dri2_surf->base.TextureTarget) { 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_TEXTURE_2D: 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GL_TEXTURE_2D; 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->tex_buffer->releaseTexBuffer!=NULL) 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*dri2_dpy->tex_buffer->releaseTexBuffer)(dri2_ctx->dri_context, 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target, 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_surf->dri_drawable); 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage * 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image(_EGLDisplay *disp, __DRIimage *dri_image) 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_image *dri2_img; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri_image == NULL) { 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "dri2_create_image"); 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img = malloc(sizeof *dri2_img); 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_img) { 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "dri2_create_image"); 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglInitImage(&dri2_img->base, disp)) { 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_img); 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img->dri_image = dri_image; 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &dri2_img->base; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage * 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx, 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLClientBuffer buffer, 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint *attr_list) 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint renderbuffer = (GLuint) (uintptr_t) buffer; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *dri_image; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (renderbuffer == 0) { 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr"); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_NO_IMAGE_KHR; 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_image = 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->createImageFromRenderbuffer(dri2_ctx->dri_context, 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org renderbuffer, NULL); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image(disp, dri_image); 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage * 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx, 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLClientBuffer buffer, const EGLint *attr_list) 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint format, name, pitch, err; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLImageAttribs attrs; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *dri_image; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org name = (EGLint) (uintptr_t) buffer; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = _eglParseImageAttribList(&attrs, disp, attr_list); 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (err != EGL_SUCCESS) 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrs.Width <= 0 || attrs.Height <= 0 || 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs.DRMBufferStrideMESA <= 0) { 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "bad width, height or stride"); 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attrs.DRMBufferFormatMESA) { 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA: 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_ARGB8888; 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitch = attrs.DRMBufferStrideMESA; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "dri2_create_image_khr: unsupported pixmap depth"); 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_image = 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen, 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs.Width, 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs.Height, 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org name, 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pitch, 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL); 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image(disp, dri_image); 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This structure describes how a wl_buffer maps to one or more 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __DRIimages. A wl_drm_buffer stores the wl_drm format code and the 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * offsets and strides of the planes in the buffer. This table maps a 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * wl_drm format code to a description of the planes in the buffer 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that lets us create a __DRIimage for each of the planes. */ 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct wl_drm_components_descriptor { 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t dri_components; 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint components; 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int nplanes; 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} wl_drm_components[] = { 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE_COMPONENTS_RGB, EGL_TEXTURE_RGB, 1 }, 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE_COMPONENTS_RGBA, EGL_TEXTURE_RGBA, 1 }, 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE_COMPONENTS_Y_U_V, EGL_TEXTURE_Y_U_V_WL, 3 }, 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE_COMPONENTS_Y_UV, EGL_TEXTURE_Y_UV_WL, 2 }, 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { __DRI_IMAGE_COMPONENTS_Y_XUXV, EGL_TEXTURE_Y_XUXV_WL, 2 }, 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage * 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx, 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLClientBuffer _buffer, 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint *attr_list) 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct wl_drm_components_descriptor *f; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *dri_image; 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLImageAttribs attrs; 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint err; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t plane; 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!wayland_buffer_is_drm(&buffer->buffer)) 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = _eglParseImageAttribList(&attrs, disp, attr_list); 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane = attrs.PlaneWL; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (err != EGL_SUCCESS) { 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer"); 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f = buffer->driver_format; 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (plane < 0 || plane >= f->nplanes) { 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "dri2_create_image_wayland_wl_buffer (plane out of bounds)"); 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_image = dri2_dpy->image->fromPlanar(buffer->driver_buffer, plane, NULL); 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri_image == NULL) { 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer"); 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image(disp, dri_image); 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_EGLImage * 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp, 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLContext *ctx, EGLenum target, 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLClientBuffer buffer, const EGLint *attr_list) 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_GL_RENDERBUFFER_KHR: 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image_khr_renderbuffer(disp, ctx, buffer, attr_list); 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_DRM_BUFFER_MESA: 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image_mesa_drm_buffer(disp, ctx, buffer, attr_list); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_WAYLAND_BUFFER_WL: 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dri2_create_image_wayland_wl_buffer(disp, ctx, buffer, attr_list); 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr"); 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_NO_IMAGE_KHR; 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_image_khr(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *image) 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_image *dri2_img = dri2_egl_image(image); 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->destroyImage(dri2_img->dri_image); 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_img); 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage * 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint *attr_list) 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_image *dri2_img; 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLImageAttribs attrs; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int dri_use, valid_mask; 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int format; 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint err = EGL_SUCCESS; 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img = malloc(sizeof *dri2_img); 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_img) { 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr"); 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_NO_IMAGE_KHR; 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!attr_list) { 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = EGL_BAD_PARAMETER; 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_img; 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_eglInitImage(&dri2_img->base, disp)) { 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = EGL_BAD_PARAMETER; 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_img; 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = _eglParseImageAttribList(&attrs, disp, attr_list); 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (err != EGL_SUCCESS) 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_img; 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrs.Width <= 0 || attrs.Height <= 0) { 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "bad width or height (%dx%d)", 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs.Width, attrs.Height); 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_img; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attrs.DRMBufferFormatMESA) { 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA: 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = __DRI_IMAGE_FORMAT_ARGB8888; 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "bad image format value 0x%04x", 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs.DRMBufferFormatMESA); 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_img; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valid_mask = 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_DRM_BUFFER_USE_SCANOUT_MESA | 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_DRM_BUFFER_USE_SHARE_MESA | 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGL_DRM_BUFFER_USE_CURSOR_MESA; 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrs.DRMBufferUseMESA & ~valid_mask) { 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "bad image use bit 0x%04x", 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs.DRMBufferUseMESA & ~valid_mask); 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_img; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_use = 0; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SHARE_MESA) 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_use |= __DRI_IMAGE_USE_SHARE; 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SCANOUT_MESA) 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_use |= __DRI_IMAGE_USE_SCANOUT; 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_CURSOR_MESA) 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri_use |= __DRI_IMAGE_USE_CURSOR; 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_img->dri_image = 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->createImage(dri2_dpy->dri_screen, 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attrs.Width, attrs.Height, 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, dri_use, dri2_img); 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_img->dri_image == NULL) { 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = EGL_BAD_ALLOC; 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto cleanup_img; 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &dri2_img->base; 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_img: 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_img); 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(err, "dri2_create_drm_image_mesa"); 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_NO_IMAGE_KHR; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_export_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img, 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint *name, EGLint *handle, EGLint *stride) 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_image *dri2_img = dri2_egl_image(img); 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (name && !dri2_dpy->image->queryImage(dri2_img->dri_image, 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRI_IMAGE_ATTRIB_NAME, name)) { 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "dri2_export_drm_image_mesa"); 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (handle) 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->queryImage(dri2_img->dri_image, 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRI_IMAGE_ATTRIB_HANDLE, handle); 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stride) 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->queryImage(dri2_img->dri_image, 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRI_IMAGE_ATTRIB_STRIDE, stride); 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wl_reference_buffer(void *user_data, uint32_t name, 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_drm_buffer *buffer) 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *disp = user_data; 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *img; 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, dri_components = 0; 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = dri2_dpy->image->createImageFromNames(dri2_dpy->dri_screen, 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->buffer.width, 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->buffer.height, 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->format, (int*)&name, 1, 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->stride, 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->offset, 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL); 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img == NULL) 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->queryImage(img, __DRI_IMAGE_ATTRIB_COMPONENTS, &dri_components); 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->driver_format = NULL; 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ARRAY_SIZE(wl_drm_components); i++) 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (wl_drm_components[i].dri_components == dri_components) 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->driver_format = &wl_drm_components[i]; 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buffer->driver_format == NULL) 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->destroyImage(img); 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->driver_buffer = img; 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wl_release_buffer(void *user_data, struct wl_drm_buffer *buffer) 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *disp = user_data; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->image->destroyImage(buffer->driver_buffer); 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct wayland_drm_callbacks wl_drm_callbacks = { 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .authenticate = NULL, 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .reference_buffer = dri2_wl_reference_buffer, 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .release_buffer = dri2_wl_release_buffer 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp, 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_display *wl_dpy) 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_dpy->wl_server_drm) 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wl_drm_callbacks.authenticate = 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (int(*)(void *, uint32_t)) dri2_dpy->authenticate; 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->wl_server_drm = 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wayland_drm_init(wl_dpy, dri2_dpy->device_name, 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &wl_drm_callbacks, disp); 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_dpy->wl_server_drm) 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp, 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_display *wl_dpy) 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) drv; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_dpy->wl_server_drm) 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wayland_drm_uninit(dri2_dpy->wl_server_drm); 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_dpy->wl_server_drm = NULL; 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp, 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_buffer *_buffer, 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint attribute, EGLint *value) 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer; 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct wl_drm_components_descriptor *format; 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!wayland_buffer_is_drm(&buffer->buffer)) 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = buffer->driver_format; 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (attribute) { 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_TEXTURE_FORMAT: 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = format->components; 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_WIDTH: 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = buffer->buffer.width; 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case EGL_HEIGHT: 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = buffer->buffer.height; 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_unload(_EGLDriver *drv) 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dri2_drv->handle) 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(dri2_drv->handle); 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_drv); 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_load(_EGLDriver *drv) 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_SHARED_GLAPI 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_ANDROID_PLATFORM 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *libname = "libglapi.so"; 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *libname = "libglapi.so.0"; 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Both libGL.so and libglapi.so are glapi providers. There is no way to 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tell which one to load. 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *libname = NULL; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *handle; 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RTLD_GLOBAL to make sure glapi symbols are visible to DRI drivers */ 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = dlopen(libname, RTLD_LAZY | RTLD_GLOBAL); 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (handle) { 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->get_proc_address = (_EGLProc (*)(const char *)) 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlsym(handle, "_glapi_get_proc_address"); 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_drv->get_proc_address || !libname) { 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no need to keep a reference */ 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dlclose(handle); 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = NULL; 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if glapi is not available, loading DRI drivers will fail */ 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_drv->get_proc_address) { 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "DRI2: failed to find _glapi_get_proc_address"); 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->glFlush = (void (*)(void)) 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->get_proc_address("glFlush"); 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->handle = handle; 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the main entrypoint into the driver, called by libEGL. 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new _EGLDriver object and init its dispatch table. 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_EGLDriver * 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglBuiltInDriverDRI2(const char *args) 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dri2_egl_driver *dri2_drv; 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) args; 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv = malloc(sizeof *dri2_drv); 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_drv) 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dri2_drv, 0, sizeof *dri2_drv); 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dri2_load(&dri2_drv->base)) { 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dri2_drv); 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglInitDriverFallbacks(&dri2_drv->base); 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.Initialize = dri2_initialize; 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.Terminate = dri2_terminate; 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.CreateContext = dri2_create_context; 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.DestroyContext = dri2_destroy_context; 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.MakeCurrent = dri2_make_current; 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.GetProcAddress = dri2_get_proc_address; 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.WaitClient = dri2_wait_client; 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.WaitNative = dri2_wait_native; 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.BindTexImage = dri2_bind_tex_image; 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.ReleaseTexImage = dri2_release_tex_image; 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.CreateImageKHR = dri2_create_image_khr; 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.DestroyImageKHR = dri2_destroy_image_khr; 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.CreateDRMImageMESA = dri2_create_drm_image_mesa; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.ExportDRMImageMESA = dri2_export_drm_image_mesa; 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.BindWaylandDisplayWL = dri2_bind_wayland_display_wl; 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.UnbindWaylandDisplayWL = dri2_unbind_wayland_display_wl; 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.API.QueryWaylandBufferWL = dri2_query_wayland_buffer_wl; 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.Name = "DRI2"; 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dri2_drv->base.Unload = dri2_unload; 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &dri2_drv->base; 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1582