lp_screen.c revision 08dd41fd6899bd6b3289d30dc31f8b2998406889
1/************************************************************************** 2 * 3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 29#include "util/u_memory.h" 30#include "util/u_simple_screen.h" 31#include "pipe/internal/p_winsys_screen.h" 32#include "pipe/p_defines.h" 33#include "pipe/p_screen.h" 34 35#include "lp_texture.h" 36#include "lp_winsys.h" 37#include "lp_jit.h" 38#include "lp_screen.h" 39 40 41static const char * 42llvmpipe_get_vendor(struct pipe_screen *screen) 43{ 44 return "Tungsten Graphics, Inc."; 45} 46 47 48static const char * 49llvmpipe_get_name(struct pipe_screen *screen) 50{ 51 return "llvmpipe"; 52} 53 54 55static int 56llvmpipe_get_param(struct pipe_screen *screen, int param) 57{ 58 switch (param) { 59 case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS: 60 return PIPE_MAX_SAMPLERS; 61 case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS: 62 return PIPE_MAX_SAMPLERS; 63 case PIPE_CAP_NPOT_TEXTURES: 64 return 1; 65 case PIPE_CAP_TWO_SIDED_STENCIL: 66 return 1; 67 case PIPE_CAP_GLSL: 68 return 1; 69 case PIPE_CAP_S3TC: 70 return 0; 71 case PIPE_CAP_ANISOTROPIC_FILTER: 72 return 0; 73 case PIPE_CAP_POINT_SPRITE: 74 return 1; 75 case PIPE_CAP_MAX_RENDER_TARGETS: 76 return PIPE_MAX_COLOR_BUFS; 77 case PIPE_CAP_OCCLUSION_QUERY: 78 return 1; 79 case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 80 return 1; 81 case PIPE_CAP_TEXTURE_MIRROR_REPEAT: 82 return 1; 83 case PIPE_CAP_TEXTURE_SHADOW_MAP: 84 return 1; 85 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 86 return 13; /* max 4Kx4K */ 87 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 88 return 8; /* max 128x128x128 */ 89 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 90 return 13; /* max 4Kx4K */ 91 case PIPE_CAP_TGSI_CONT_SUPPORTED: 92 return 1; 93 case PIPE_CAP_BLEND_EQUATION_SEPARATE: 94 return 1; 95 default: 96 return 0; 97 } 98} 99 100 101static float 102llvmpipe_get_paramf(struct pipe_screen *screen, int param) 103{ 104 switch (param) { 105 case PIPE_CAP_MAX_LINE_WIDTH: 106 /* fall-through */ 107 case PIPE_CAP_MAX_LINE_WIDTH_AA: 108 return 255.0; /* arbitrary */ 109 case PIPE_CAP_MAX_POINT_WIDTH: 110 /* fall-through */ 111 case PIPE_CAP_MAX_POINT_WIDTH_AA: 112 return 255.0; /* arbitrary */ 113 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY: 114 return 16.0; /* not actually signficant at this time */ 115 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS: 116 return 16.0; /* arbitrary */ 117 default: 118 return 0; 119 } 120} 121 122 123/** 124 * Query format support for creating a texture, drawing surface, etc. 125 * \param format the format to test 126 * \param type one of PIPE_TEXTURE, PIPE_SURFACE 127 */ 128static boolean 129llvmpipe_is_format_supported( struct pipe_screen *screen, 130 enum pipe_format format, 131 enum pipe_texture_target target, 132 unsigned tex_usage, 133 unsigned geom_flags ) 134{ 135 assert(target == PIPE_TEXTURE_1D || 136 target == PIPE_TEXTURE_2D || 137 target == PIPE_TEXTURE_3D || 138 target == PIPE_TEXTURE_CUBE); 139 140 if(format == PIPE_FORMAT_Z16_UNORM) 141 return FALSE; 142 if(format == PIPE_FORMAT_S8_UNORM) 143 return FALSE; 144 145 switch(format) { 146 case PIPE_FORMAT_DXT1_RGB: 147 case PIPE_FORMAT_DXT1_RGBA: 148 case PIPE_FORMAT_DXT3_RGBA: 149 case PIPE_FORMAT_DXT5_RGBA: 150 return FALSE; 151 default: 152 return TRUE; 153 } 154} 155 156 157static void 158llvmpipe_destroy_screen( struct pipe_screen *_screen ) 159{ 160 struct llvmpipe_screen *screen = llvmpipe_screen(_screen); 161 162 struct pipe_winsys *winsys = _screen->winsys; 163 164 lp_jit_screen_cleanup(screen); 165 166 if(winsys->destroy) 167 winsys->destroy(winsys); 168 169 FREE(screen); 170} 171 172 173 174/** 175 * Create a new pipe_screen object 176 * Note: we're not presently subclassing pipe_screen (no llvmpipe_screen). 177 */ 178struct pipe_screen * 179llvmpipe_create_screen(struct pipe_winsys *winsys) 180{ 181 struct llvmpipe_screen *screen = CALLOC_STRUCT(llvmpipe_screen); 182 183 if (!screen) 184 return NULL; 185 186 screen->base.winsys = winsys; 187 188 screen->base.destroy = llvmpipe_destroy_screen; 189 190 screen->base.get_name = llvmpipe_get_name; 191 screen->base.get_vendor = llvmpipe_get_vendor; 192 screen->base.get_param = llvmpipe_get_param; 193 screen->base.get_paramf = llvmpipe_get_paramf; 194 screen->base.is_format_supported = llvmpipe_is_format_supported; 195 196 llvmpipe_init_screen_texture_funcs(&screen->base); 197 u_simple_screen_init(&screen->base); 198 199 lp_jit_screen_init(screen); 200 201 return &screen->base; 202} 203