Nouveau: name replace for nv20.
[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 NOUVEAU_CAP_HW_VTXBUF:
54 case NOUVEAU_CAP_HW_IDXBUF:
55 return 0;
56 default:
57 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
58 return 0;
59 }
60 }
61
62 static float
63 nv20_screen_get_paramf(struct pipe_screen *screen, int param)
64 {
65 switch (param) {
66 case PIPE_CAP_MAX_LINE_WIDTH:
67 case PIPE_CAP_MAX_LINE_WIDTH_AA:
68 return 10.0;
69 case PIPE_CAP_MAX_POINT_WIDTH:
70 case PIPE_CAP_MAX_POINT_WIDTH_AA:
71 return 64.0;
72 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
73 return 2.0;
74 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
75 return 4.0;
76 default:
77 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
78 return 0.0;
79 }
80 }
81
82 static boolean
83 nv20_screen_is_format_supported(struct pipe_screen *screen,
84 enum pipe_format format,
85 enum pipe_texture_target target,
86 unsigned tex_usage, unsigned geom_flags)
87 {
88 if (tex_usage & PIPE_TEXTURE_USAGE_RENDER_TARGET) {
89 switch (format) {
90 case PIPE_FORMAT_A8R8G8B8_UNORM:
91 case PIPE_FORMAT_R5G6B5_UNORM:
92 case PIPE_FORMAT_Z24S8_UNORM:
93 case PIPE_FORMAT_Z16_UNORM:
94 return TRUE;
95 default:
96 break;
97 }
98 } else {
99 switch (format) {
100 case PIPE_FORMAT_A8R8G8B8_UNORM:
101 case PIPE_FORMAT_A1R5G5B5_UNORM:
102 case PIPE_FORMAT_A4R4G4B4_UNORM:
103 case PIPE_FORMAT_R5G6B5_UNORM:
104 case PIPE_FORMAT_L8_UNORM:
105 case PIPE_FORMAT_A8_UNORM:
106 case PIPE_FORMAT_I8_UNORM:
107 return TRUE;
108 default:
109 break;
110 }
111 }
112
113 return FALSE;
114 }
115
116 static void *
117 nv20_surface_map(struct pipe_screen *screen, struct pipe_surface *surface,
118 unsigned flags )
119 {
120 struct pipe_winsys *ws = screen->winsys;
121 void *map;
122
123 map = ws->buffer_map(ws, surface->buffer, flags);
124 if (!map)
125 return NULL;
126
127 return map + surface->offset;
128 }
129
130 static void
131 nv20_surface_unmap(struct pipe_screen *screen, struct pipe_surface *surface)
132 {
133 struct pipe_winsys *ws = screen->winsys;
134
135 ws->buffer_unmap(ws, surface->buffer);
136 }
137
138 static void
139 nv20_screen_destroy(struct pipe_screen *pscreen)
140 {
141 struct nv20_screen *screen = nv20_screen(pscreen);
142 struct nouveau_winsys *nvws = screen->nvws;
143
144 nvws->notifier_free(&screen->sync);
145 nvws->grobj_free(&screen->kelvin);
146
147 FREE(pscreen);
148 }
149
150 struct pipe_screen *
151 nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
152 {
153 struct nv20_screen *screen = CALLOC_STRUCT(nv20_screen);
154 unsigned celsius_class;
155 unsigned chipset = nvws->channel->device->chipset;
156 int ret;
157
158 if (!screen)
159 return NULL;
160 screen->nvws = nvws;
161
162 /* 3D object */
163 if (chipset>=0x20)
164 celsius_class=NV11TCL;
165 else if (chipset>=0x17)
166 celsius_class=NV17TCL;
167 else if (chipset>=0x11)
168 celsius_class=NV11TCL;
169 else
170 celsius_class=NV10TCL;
171
172 if (!celsius_class) {
173 NOUVEAU_ERR("Unknown nv1x chipset: nv%02x\n", chipset);
174 return NULL;
175 }
176
177 ret = nvws->grobj_alloc(nvws, celsius_class, &screen->kelvin);
178 if (ret) {
179 NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
180 return FALSE;
181 }
182
183 /* Notifier for sync purposes */
184 ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
185 if (ret) {
186 NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
187 nv20_screen_destroy(&screen->pipe);
188 return NULL;
189 }
190
191 screen->pipe.winsys = ws;
192 screen->pipe.destroy = nv20_screen_destroy;
193
194 screen->pipe.get_name = nv20_screen_get_name;
195 screen->pipe.get_vendor = nv20_screen_get_vendor;
196 screen->pipe.get_param = nv20_screen_get_param;
197 screen->pipe.get_paramf = nv20_screen_get_paramf;
198
199 screen->pipe.is_format_supported = nv20_screen_is_format_supported;
200
201 screen->pipe.surface_map = nv20_surface_map;
202 screen->pipe.surface_unmap = nv20_surface_unmap;
203
204 nv20_screen_init_miptree_functions(&screen->pipe);
205
206 return &screen->pipe;
207 }
208