1 /* 2 * Mesa 3-D graphics library 3 * Version: 7.10 4 * 5 * Copyright (C) 2011 LunarG Inc. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 * DEALINGS IN THE SOFTWARE. 24 * 25 * Authors: 26 * Chia-I Wu <olv (at) lunarg.com> 27 */ 28 #include "target-helpers/inline_debug_helper.h" 29 #include "target-helpers/inline_sw_helper.h" 30 #include "egl_pipe.h" 31 32 /* for i915 */ 33 #include "i915/drm/i915_drm_public.h" 34 #include "i915/i915_public.h" 35 #include "target-helpers/inline_wrapper_sw_helper.h" 36 /* for nouveau */ 37 #include "nouveau/drm/nouveau_drm_public.h" 38 /* for r300 */ 39 #include "radeon/drm/radeon_drm_public.h" 40 #include "r300/r300_public.h" 41 /* for r600 */ 42 #include "r600/r600_public.h" 43 /* for radeonsi */ 44 #include "radeonsi/radeonsi_public.h" 45 /* for vmwgfx */ 46 #include "svga/drm/svga_drm_public.h" 47 #include "svga/svga_public.h" 48 49 static struct pipe_screen * 50 pipe_i915_create_screen(int fd) 51 { 52 #if _EGL_PIPE_I915 53 struct i915_winsys *iws; 54 struct pipe_screen *screen; 55 56 iws = i915_drm_winsys_create(fd); 57 if (!iws) 58 return NULL; 59 60 screen = i915_screen_create(iws); 61 if (!screen) 62 return NULL; 63 64 screen = debug_screen_wrap(screen); 65 66 return screen; 67 #else 68 return NULL; 69 #endif 70 } 71 72 static struct pipe_screen * 73 pipe_nouveau_create_screen(int fd) 74 { 75 #if _EGL_PIPE_NOUVEAU 76 struct pipe_screen *screen; 77 78 screen = nouveau_drm_screen_create(fd); 79 if (!screen) 80 return NULL; 81 82 screen = debug_screen_wrap(screen); 83 84 return screen; 85 #else 86 return NULL; 87 #endif 88 } 89 90 static struct pipe_screen * 91 pipe_r300_create_screen(int fd) 92 { 93 #if _EGL_PIPE_R300 94 struct radeon_winsys *sws; 95 struct pipe_screen *screen; 96 97 sws = radeon_drm_winsys_create(fd); 98 if (!sws) 99 return NULL; 100 101 screen = r300_screen_create(sws); 102 if (!screen) 103 return NULL; 104 105 screen = debug_screen_wrap(screen); 106 107 return screen; 108 #else 109 return NULL; 110 #endif 111 } 112 113 static struct pipe_screen * 114 pipe_r600_create_screen(int fd) 115 { 116 #if _EGL_PIPE_R600 117 struct radeon_winsys *rw; 118 struct pipe_screen *screen; 119 120 rw = radeon_drm_winsys_create(fd); 121 if (!rw) 122 return NULL; 123 124 screen = r600_screen_create(rw); 125 if (!screen) 126 return NULL; 127 128 screen = debug_screen_wrap(screen); 129 130 return screen; 131 #else 132 return NULL; 133 #endif 134 } 135 136 static struct pipe_screen * 137 pipe_radeonsi_create_screen(int fd) 138 { 139 #if _EGL_PIPE_RADEONSI 140 struct radeon_winsys *rw; 141 struct pipe_screen *screen; 142 143 rw = radeon_drm_winsys_create(fd); 144 if (!rw) 145 return NULL; 146 147 screen = radeonsi_screen_create(rw); 148 if (!screen) 149 return NULL; 150 151 screen = debug_screen_wrap(screen); 152 153 return screen; 154 #else 155 return NULL; 156 #endif 157 } 158 159 static struct pipe_screen * 160 pipe_vmwgfx_create_screen(int fd) 161 { 162 #if _EGL_PIPE_VMWGFX 163 struct svga_winsys_screen *sws; 164 struct pipe_screen *screen; 165 166 sws = svga_drm_winsys_screen_create(fd); 167 if (!sws) 168 return NULL; 169 170 screen = svga_screen_create(sws); 171 if (!screen) 172 return NULL; 173 174 screen = debug_screen_wrap(screen); 175 176 return screen; 177 #else 178 return NULL; 179 #endif 180 } 181 182 struct pipe_screen * 183 egl_pipe_create_drm_screen(const char *name, int fd) 184 { 185 if (strcmp(name, "i915") == 0) 186 return pipe_i915_create_screen(fd); 187 else if (strcmp(name, "nouveau") == 0) 188 return pipe_nouveau_create_screen(fd); 189 else if (strcmp(name, "r300") == 0) 190 return pipe_r300_create_screen(fd); 191 else if (strcmp(name, "r600") == 0) 192 return pipe_r600_create_screen(fd); 193 else if (strcmp(name, "radeonsi") == 0) 194 return pipe_radeonsi_create_screen(fd); 195 else if (strcmp(name, "vmwgfx") == 0) 196 return pipe_vmwgfx_create_screen(fd); 197 else 198 return NULL; 199 } 200 201 struct pipe_screen * 202 egl_pipe_create_swrast_screen(struct sw_winsys *ws) 203 { 204 struct pipe_screen *screen; 205 206 screen = sw_screen_create(ws); 207 if (screen) 208 screen = debug_screen_wrap(screen); 209 210 return screen; 211 } 212