sp_screen.c revision 940ca2e837efe45caae1cf1d9665f6736347705d
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 "sp_texture.h" 36#include "sp_winsys.h" 37#include "sp_screen.h" 38 39 40static const char * 41softpipe_get_vendor(struct pipe_screen *screen) 42{ 43 return "Tungsten Graphics, Inc."; 44} 45 46 47static const char * 48softpipe_get_name(struct pipe_screen *screen) 49{ 50 return "softpipe"; 51} 52 53 54static int 55softpipe_get_param(struct pipe_screen *screen, int param) 56{ 57 switch (param) { 58 case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS: 59 return PIPE_MAX_SAMPLERS; 60 case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS: 61 return PIPE_MAX_SAMPLERS; 62 case PIPE_CAP_NPOT_TEXTURES: 63 return 1; 64 case PIPE_CAP_TWO_SIDED_STENCIL: 65 return 1; 66 case PIPE_CAP_GLSL: 67 return 1; 68 case PIPE_CAP_S3TC: 69 return 0; 70 case PIPE_CAP_ANISOTROPIC_FILTER: 71 return 0; 72 case PIPE_CAP_POINT_SPRITE: 73 return 1; 74 case PIPE_CAP_MAX_RENDER_TARGETS: 75 return PIPE_MAX_COLOR_BUFS; 76 case PIPE_CAP_OCCLUSION_QUERY: 77 return 1; 78 case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 79 return 1; 80 case PIPE_CAP_TEXTURE_MIRROR_REPEAT: 81 return 1; 82 case PIPE_CAP_TEXTURE_SHADOW_MAP: 83 return 1; 84 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 85 return 13; /* max 4Kx4K */ 86 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 87 return 9; /* max 256x256x256 */ 88 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 89 return 13; /* max 4Kx4K */ 90 case PIPE_CAP_TGSI_CONT_SUPPORTED: 91 return 1; 92 case PIPE_CAP_BLEND_EQUATION_SEPARATE: 93 return 1; 94 default: 95 return 0; 96 } 97} 98 99 100static float 101softpipe_get_paramf(struct pipe_screen *screen, int param) 102{ 103 switch (param) { 104 case PIPE_CAP_MAX_LINE_WIDTH: 105 /* fall-through */ 106 case PIPE_CAP_MAX_LINE_WIDTH_AA: 107 return 255.0; /* arbitrary */ 108 case PIPE_CAP_MAX_POINT_WIDTH: 109 /* fall-through */ 110 case PIPE_CAP_MAX_POINT_WIDTH_AA: 111 return 255.0; /* arbitrary */ 112 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY: 113 return 16.0; /* not actually signficant at this time */ 114 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS: 115 return 16.0; /* arbitrary */ 116 default: 117 return 0; 118 } 119} 120 121 122/** 123 * Query format support for creating a texture, drawing surface, etc. 124 * \param format the format to test 125 * \param type one of PIPE_TEXTURE, PIPE_SURFACE 126 */ 127static boolean 128softpipe_is_format_supported( struct pipe_screen *screen, 129 enum pipe_format format, 130 enum pipe_texture_target target, 131 unsigned tex_usage, 132 unsigned geom_flags ) 133{ 134 assert(target == PIPE_TEXTURE_1D || 135 target == PIPE_TEXTURE_2D || 136 target == PIPE_TEXTURE_3D || 137 target == PIPE_TEXTURE_CUBE); 138 139 switch(format) { 140 case PIPE_FORMAT_DXT1_RGB: 141 case PIPE_FORMAT_DXT1_RGBA: 142 case PIPE_FORMAT_DXT3_RGBA: 143 case PIPE_FORMAT_DXT5_RGBA: 144 return FALSE; 145 default: 146 return TRUE; 147 } 148} 149 150 151static void 152softpipe_destroy_screen( struct pipe_screen *screen ) 153{ 154 struct pipe_winsys *winsys = screen->winsys; 155 156 if(winsys->destroy) 157 winsys->destroy(winsys); 158 159 FREE(screen); 160} 161 162 163 164/** 165 * Create a new pipe_screen object 166 * Note: we're not presently subclassing pipe_screen (no softpipe_screen). 167 */ 168struct pipe_screen * 169softpipe_create_screen(struct pipe_winsys *winsys) 170{ 171 struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen); 172 173 if (!screen) 174 return NULL; 175 176 screen->base.winsys = winsys; 177 178 screen->base.destroy = softpipe_destroy_screen; 179 180 screen->base.get_name = softpipe_get_name; 181 screen->base.get_vendor = softpipe_get_vendor; 182 screen->base.get_param = softpipe_get_param; 183 screen->base.get_paramf = softpipe_get_paramf; 184 screen->base.is_format_supported = softpipe_is_format_supported; 185 186 softpipe_init_screen_texture_funcs(&screen->base); 187 u_simple_screen_init(&screen->base); 188 189 return &screen->base; 190} 191