1 /* 2 * Copyright (c) 2012 Intel Corporation. All Rights Reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sub license, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the 13 * next paragraph) shall be included in all copies or substantial portions 14 * of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 #include "va_dricommon.h" 25 26 // X error trap 27 static int x11_error_code = 0; 28 static int (*old_error_handler)(Display *, XErrorEvent *); 29 30 static int 31 error_handler(Display *dpy, XErrorEvent *error) 32 { 33 x11_error_code = error->error_code; 34 return 0; 35 } 36 37 static void 38 x11_trap_errors(void) 39 { 40 x11_error_code = 0; 41 old_error_handler = XSetErrorHandler(error_handler); 42 } 43 44 static int 45 x11_untrap_errors(void) 46 { 47 XSetErrorHandler(old_error_handler); 48 return x11_error_code; 49 } 50 51 static int 52 is_window(Display *dpy, Drawable drawable) 53 { 54 XWindowAttributes wattr; 55 56 x11_trap_errors(); 57 XGetWindowAttributes(dpy, drawable, &wattr); 58 return x11_untrap_errors() == 0; 59 } 60 61 static struct dri_drawable * 62 do_drawable_hash(VADriverContextP ctx, XID drawable) 63 { 64 struct dri_state *dri_state = (struct dri_state *)ctx->drm_state; 65 int index = drawable % DRAWABLE_HASH_SZ; 66 struct dri_drawable *dri_drawable = dri_state->drawable_hash[index]; 67 68 while (dri_drawable) { 69 if (dri_drawable->x_drawable == drawable) 70 return dri_drawable; 71 dri_drawable = dri_drawable->next; 72 } 73 74 dri_drawable = dri_state->createDrawable(ctx, drawable); 75 dri_drawable->x_drawable = drawable; 76 dri_drawable->is_window = is_window(ctx->native_dpy, drawable); 77 dri_drawable->next = dri_state->drawable_hash[index]; 78 dri_state->drawable_hash[index] = dri_drawable; 79 80 return dri_drawable; 81 } 82 83 void 84 free_drawable(VADriverContextP ctx, struct dri_drawable* dri_drawable) 85 { 86 struct dri_state *dri_state = (struct dri_state *)ctx->drm_state; 87 int i = 0; 88 89 while (i++ < DRAWABLE_HASH_SZ) { 90 if (dri_drawable == dri_state->drawable_hash[i]) { 91 dri_state->destroyDrawable(ctx, dri_drawable); 92 dri_state->drawable_hash[i] = NULL; 93 } 94 } 95 } 96 97 void 98 free_drawable_hashtable(VADriverContextP ctx) 99 { 100 struct dri_state *dri_state = (struct dri_state *)ctx->drm_state; 101 int i; 102 struct dri_drawable *dri_drawable, *prev; 103 104 for (i = 0; i < DRAWABLE_HASH_SZ; i++) { 105 dri_drawable = dri_state->drawable_hash[i]; 106 107 while (dri_drawable) { 108 prev = dri_drawable; 109 dri_drawable = prev->next; 110 dri_state->destroyDrawable(ctx, prev); 111 } 112 113 dri_state->drawable_hash[i] = NULL; 114 } 115 } 116 117 struct dri_drawable * 118 dri_get_drawable(VADriverContextP ctx, XID drawable) 119 { 120 return do_drawable_hash(ctx, drawable); 121 } 122 123 void 124 dri_swap_buffer(VADriverContextP ctx, struct dri_drawable *dri_drawable) 125 { 126 struct dri_state *dri_state = (struct dri_state *)ctx->drm_state; 127 128 dri_state->swapBuffer(ctx, dri_drawable); 129 } 130 131 union dri_buffer * 132 dri_get_rendering_buffer(VADriverContextP ctx, struct dri_drawable *dri_drawable) 133 { 134 struct dri_state *dri_state = (struct dri_state *)ctx->drm_state; 135 136 return dri_state->getRenderingBuffer(ctx, dri_drawable); 137 } 138