sp_screen.c revision af7fb892d8f1eff1f0e787bf8c7d65165e3aa51e
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 12; /* max 2Kx2K */ 86 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 87 return 8; /* max 128x128x128 */ 88 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 89 return 12; /* max 2Kx2K */ 90 case PIPE_CAP_TGSI_CONT_SUPPORTED: 91 return 1; 92 default: 93 return 0; 94 } 95} 96 97 98static float 99softpipe_get_paramf(struct pipe_screen *screen, int param) 100{ 101 switch (param) { 102 case PIPE_CAP_MAX_LINE_WIDTH: 103 /* fall-through */ 104 case PIPE_CAP_MAX_LINE_WIDTH_AA: 105 return 255.0; /* arbitrary */ 106 case PIPE_CAP_MAX_POINT_WIDTH: 107 /* fall-through */ 108 case PIPE_CAP_MAX_POINT_WIDTH_AA: 109 return 255.0; /* arbitrary */ 110 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY: 111 return 0.0; 112 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS: 113 return 16.0; /* arbitrary */ 114 default: 115 return 0; 116 } 117} 118 119 120/** 121 * Query format support for creating a texture, drawing surface, etc. 122 * \param format the format to test 123 * \param type one of PIPE_TEXTURE, PIPE_SURFACE 124 */ 125static boolean 126softpipe_is_format_supported( struct pipe_screen *screen, 127 enum pipe_format format, 128 enum pipe_texture_target target, 129 unsigned tex_usage, 130 unsigned geom_flags ) 131{ 132 assert(target == PIPE_TEXTURE_1D || 133 target == PIPE_TEXTURE_2D || 134 target == PIPE_TEXTURE_3D || 135 target == PIPE_TEXTURE_CUBE); 136 137 switch(format) { 138 case PIPE_FORMAT_DXT1_RGB: 139 case PIPE_FORMAT_DXT1_RGBA: 140 case PIPE_FORMAT_DXT3_RGBA: 141 case PIPE_FORMAT_DXT5_RGBA: 142 return FALSE; 143 default: 144 return TRUE; 145 } 146} 147 148 149static void 150softpipe_destroy_screen( struct pipe_screen *screen ) 151{ 152 struct pipe_winsys *winsys = screen->winsys; 153 154 if(winsys->destroy) 155 winsys->destroy(winsys); 156 157 FREE(screen); 158} 159 160 161 162/** 163 * Create a new pipe_screen object 164 * Note: we're not presently subclassing pipe_screen (no softpipe_screen). 165 */ 166struct pipe_screen * 167softpipe_create_screen(struct pipe_winsys *winsys) 168{ 169 struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen); 170 171 if (!screen) 172 return NULL; 173 174 screen->base.winsys = winsys; 175 176 screen->base.destroy = softpipe_destroy_screen; 177 178 screen->base.get_name = softpipe_get_name; 179 screen->base.get_vendor = softpipe_get_vendor; 180 screen->base.get_param = softpipe_get_param; 181 screen->base.get_paramf = softpipe_get_paramf; 182 screen->base.is_format_supported = softpipe_is_format_supported; 183 184 softpipe_init_screen_texture_funcs(&screen->base); 185 u_simple_screen_init(&screen->base); 186 187 return &screen->base; 188} 189