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