sp_screen.c revision cdc920a0
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 "util/u_simple_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#include "sp_context.h" 39 40 41static const char * 42softpipe_get_vendor(struct pipe_screen *screen) 43{ 44 return "VMware, Inc."; 45} 46 47 48static const char * 49softpipe_get_name(struct pipe_screen *screen) 50{ 51 return "softpipe"; 52} 53 54 55static int 56softpipe_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_VERTEX_SAMPLERS; 63 case PIPE_CAP_MAX_COMBINED_SAMPLERS: 64 return PIPE_MAX_SAMPLERS + PIPE_MAX_VERTEX_SAMPLERS; 65 case PIPE_CAP_NPOT_TEXTURES: 66 return 1; 67 case PIPE_CAP_TWO_SIDED_STENCIL: 68 return 1; 69 case PIPE_CAP_GLSL: 70 return 1; 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 9; /* max 256x256x256 */ 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 case PIPE_CAP_MAX_CONST_BUFFERS: 96 return PIPE_MAX_CONSTANT_BUFFERS; 97 case PIPE_CAP_MAX_CONST_BUFFER_SIZE: 98 return 4096 * 4 * sizeof(float); 99 case PIPE_CAP_INDEP_BLEND_ENABLE: 100 return 1; 101 case PIPE_CAP_INDEP_BLEND_FUNC: 102 return 1; 103 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 104 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: 105 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 106 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 107 return 1; 108 default: 109 return 0; 110 } 111} 112 113 114static float 115softpipe_get_paramf(struct pipe_screen *screen, int param) 116{ 117 switch (param) { 118 case PIPE_CAP_MAX_LINE_WIDTH: 119 /* fall-through */ 120 case PIPE_CAP_MAX_LINE_WIDTH_AA: 121 return 255.0; /* arbitrary */ 122 case PIPE_CAP_MAX_POINT_WIDTH: 123 /* fall-through */ 124 case PIPE_CAP_MAX_POINT_WIDTH_AA: 125 return 255.0; /* arbitrary */ 126 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY: 127 return 16.0; /* not actually signficant at this time */ 128 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS: 129 return 16.0; /* arbitrary */ 130 default: 131 return 0; 132 } 133} 134 135 136/** 137 * Query format support for creating a texture, drawing surface, etc. 138 * \param format the format to test 139 * \param type one of PIPE_TEXTURE, PIPE_SURFACE 140 */ 141static boolean 142softpipe_is_format_supported( struct pipe_screen *screen, 143 enum pipe_format format, 144 enum pipe_texture_target target, 145 unsigned tex_usage, 146 unsigned geom_flags ) 147{ 148 assert(target == PIPE_TEXTURE_1D || 149 target == PIPE_TEXTURE_2D || 150 target == PIPE_TEXTURE_3D || 151 target == PIPE_TEXTURE_CUBE); 152 153 switch(format) { 154 case PIPE_FORMAT_L16_UNORM: 155 case PIPE_FORMAT_YUYV: 156 case PIPE_FORMAT_UYVY: 157 case PIPE_FORMAT_DXT1_RGB: 158 case PIPE_FORMAT_DXT1_RGBA: 159 case PIPE_FORMAT_DXT3_RGBA: 160 case PIPE_FORMAT_DXT5_RGBA: 161 case PIPE_FORMAT_Z32_FLOAT: 162 case PIPE_FORMAT_R8G8_SNORM: 163 case PIPE_FORMAT_R5SG5SB6U_NORM: 164 case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 165 case PIPE_FORMAT_R8G8B8A8_SNORM: 166 case PIPE_FORMAT_NONE: 167 return FALSE; 168 default: 169 return TRUE; 170 } 171} 172 173 174static void 175softpipe_destroy_screen( struct pipe_screen *screen ) 176{ 177 struct pipe_winsys *winsys = screen->winsys; 178 179 if(winsys->destroy) 180 winsys->destroy(winsys); 181 182 FREE(screen); 183} 184 185 186 187/** 188 * Create a new pipe_screen object 189 * Note: we're not presently subclassing pipe_screen (no softpipe_screen). 190 */ 191struct pipe_screen * 192softpipe_create_screen(struct pipe_winsys *winsys) 193{ 194 struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen); 195 196 if (!screen) 197 return NULL; 198 199 screen->base.winsys = winsys; 200 201 screen->base.destroy = softpipe_destroy_screen; 202 203 screen->base.get_name = softpipe_get_name; 204 screen->base.get_vendor = softpipe_get_vendor; 205 screen->base.get_param = softpipe_get_param; 206 screen->base.get_paramf = softpipe_get_paramf; 207 screen->base.is_format_supported = softpipe_is_format_supported; 208 screen->base.context_create = softpipe_create_context; 209 210 softpipe_init_screen_texture_funcs(&screen->base); 211 u_simple_screen_init(&screen->base); 212 213 return &screen->base; 214} 215