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