gallium: make p_winsys internal
[mesa.git] / src / gallium / drivers / nv20 / nv20_screen.c
1 #include "pipe/p_screen.h"
2
3 #include "nv20_context.h"
4 #include "nv20_screen.h"
5
6 static const char *
7 nv20_screen_get_name(struct pipe_screen *screen)
8 {
9 struct nv20_screen *nv20screen = nv20_screen(screen);
10 struct nouveau_device *dev = nv20screen->nvws->channel->device;
11 static char buffer[128];
12
13 snprintf(buffer, sizeof(buffer), "NV%02X", dev->chipset);
14 return buffer;
15 }
16
17 static const char *
18 nv20_screen_get_vendor(struct pipe_screen *screen)
19 {
20 return "nouveau";
21 }
22
23 static int
24 nv20_screen_get_param(struct pipe_screen *screen, int param)
25 {
26 switch (param) {
27 case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
28 return 2;
29 case PIPE_CAP_NPOT_TEXTURES:
30 return 0;
31 case PIPE_CAP_TWO_SIDED_STENCIL:
32 return 0;
33 case PIPE_CAP_GLSL:
34 return 0;
35 case PIPE_CAP_S3TC:
36 return 0;
37 case PIPE_CAP_ANISOTROPIC_FILTER:
38 return 1;
39 case PIPE_CAP_POINT_SPRITE:
40 return 0;
41 case PIPE_CAP_MAX_RENDER_TARGETS:
42 return 1;
43 case PIPE_CAP_OCCLUSION_QUERY:
44 return 0;
45 case PIPE_CAP_TEXTURE_SHADOW_MAP:
46 return 0;
47 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
48 return 12;
49 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
50 return 0;
51 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
52 return 12;
53 case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
54 return 0;
55 case NOUVEAU_CAP_HW_VTXBUF:
56 case NOUVEAU_CAP_HW_IDXBUF:
57 return 0;
58 default:
59 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
60 return 0;
61 }
62 }
63
64 static float
65 nv20_screen_get_paramf(struct pipe_screen *screen, int param)
66 {
67 switch (param) {
68 case PIPE_CAP_MAX_LINE_WIDTH:
69 case PIPE_CAP_MAX_LINE_WIDTH_AA:
70 return 10.0;
71 case PIPE_CAP_MAX_POINT_WIDTH:
72 case PIPE_CAP_MAX_POINT_WIDTH_AA:
73 return 64.0;
74 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
75 return 2.0;
76 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
77 return 4.0;
78 default:
79 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
80 return 0.0;
81 }
82 }
83
84 static boolean
85 nv20_screen_is_format_supported(struct pipe_screen *screen,
86 enum pipe_format format,
87 enum pipe_texture_target target,
88 unsigned tex_usage, unsigned geom_flags)
89 {
90 if (tex_usage & PIPE_TEXTURE_USAGE_RENDER_TARGET) {
91 switch (format) {
92 case PIPE_FORMAT_A8R8G8B8_UNORM:
93 case PIPE_FORMAT_R5G6B5_UNORM:
94 case PIPE_FORMAT_Z24S8_UNORM:
95 case PIPE_FORMAT_Z16_UNORM:
96 return TRUE;
97 default:
98 break;
99 }
100 } else {
101 switch (format) {
102 case PIPE_FORMAT_A8R8G8B8_UNORM:
103 case PIPE_FORMAT_A1R5G5B5_UNORM:
104 case PIPE_FORMAT_A4R4G4B4_UNORM:
105 case PIPE_FORMAT_R5G6B5_UNORM:
106 case PIPE_FORMAT_L8_UNORM:
107 case PIPE_FORMAT_A8_UNORM:
108 case PIPE_FORMAT_I8_UNORM:
109 return TRUE;
110 default:
111 break;
112 }
113 }
114
115 return FALSE;
116 }
117
118 static void *
119 nv20_surface_map(struct pipe_screen *screen, struct pipe_surface *surface,
120 unsigned flags )
121 {
122 struct pipe_winsys *ws = screen->winsys;
123 void *map;
124
125 map = ws->buffer_map(ws, surface->buffer, flags);
126 if (!map)
127 return NULL;
128
129 return map + surface->offset;
130 }
131
132 static void
133 nv20_surface_unmap(struct pipe_screen *screen, struct pipe_surface *surface)
134 {
135 struct pipe_winsys *ws = screen->winsys;
136
137 ws->buffer_unmap(ws, surface->buffer);
138 }
139
140 static void
141 nv20_screen_destroy(struct pipe_screen *pscreen)
142 {
143 struct nv20_screen *screen = nv20_screen(pscreen);
144 struct nouveau_winsys *nvws = screen->nvws;
145
146 nvws->notifier_free(&screen->sync);
147 nvws->grobj_free(&screen->kelvin);
148
149 FREE(pscreen);
150 }
151
152 struct pipe_screen *
153 nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
154 {
155 struct nv20_screen *screen = CALLOC_STRUCT(nv20_screen);
156 unsigned kelvin_class = 0;
157 unsigned chipset = nvws->channel->device->chipset;
158 int ret;
159
160 if (!screen)
161 return NULL;
162 screen->nvws = nvws;
163
164 /* 3D object */
165 if (chipset >= 0x25)
166 kelvin_class = NV25TCL;
167 else if (chipset >= 0x20)
168 kelvin_class = NV20TCL;
169
170 if (!kelvin_class || chipset >= 0x30) {
171 NOUVEAU_ERR("Unknown nv2x chipset: nv%02x\n", chipset);
172 return NULL;
173 }
174
175 ret = nvws->grobj_alloc(nvws, kelvin_class, &screen->kelvin);
176 if (ret) {
177 NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
178 return FALSE;
179 }
180
181 /* Notifier for sync purposes */
182 ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
183 if (ret) {
184 NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
185 nv20_screen_destroy(&screen->pipe);
186 return NULL;
187 }
188
189 screen->pipe.winsys = ws;
190 screen->pipe.destroy = nv20_screen_destroy;
191
192 screen->pipe.get_name = nv20_screen_get_name;
193 screen->pipe.get_vendor = nv20_screen_get_vendor;
194 screen->pipe.get_param = nv20_screen_get_param;
195 screen->pipe.get_paramf = nv20_screen_get_paramf;
196
197 screen->pipe.is_format_supported = nv20_screen_is_format_supported;
198
199 screen->pipe.surface_map = nv20_surface_map;
200 screen->pipe.surface_unmap = nv20_surface_unmap;
201
202 nv20_screen_init_miptree_functions(&screen->pipe);
203
204 return &screen->pipe;
205 }
206