nouveau: implement pipe_screen
[mesa.git] / src / gallium / drivers / nv30 / nv30_screen.c
1 #include "pipe/p_screen.h"
2 #include "pipe/p_util.h"
3
4 #include "nv30_context.h"
5 #include "nv30_screen.h"
6
7 static const char *
8 nv30_screen_get_name(struct pipe_screen *screen)
9 {
10 struct nv30_screen *nv30screen = nv30_screen(screen);
11 static char buffer[128];
12
13 snprintf(buffer, sizeof(buffer), "NV%02X", nv30screen->chipset);
14 return buffer;
15 }
16
17 static const char *
18 nv30_screen_get_vendor(struct pipe_screen *screen)
19 {
20 return "nouveau";
21 }
22
23 static int
24 nv30_screen_get_param(struct pipe_screen *screen, int param)
25 {
26 switch (param) {
27 case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
28 return 16;
29 case PIPE_CAP_NPOT_TEXTURES:
30 return 0;
31 case PIPE_CAP_TWO_SIDED_STENCIL:
32 return 1;
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 1;
41 case PIPE_CAP_MAX_RENDER_TARGETS:
42 return 2;
43 case PIPE_CAP_OCCLUSION_QUERY:
44 return 1;
45 case PIPE_CAP_TEXTURE_SHADOW_MAP:
46 return 1;
47 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
48 return 13;
49 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
50 return 10;
51 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
52 return 13;
53 default:
54 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
55 return 0;
56 }
57 }
58
59 static float
60 nv30_screen_get_paramf(struct pipe_screen *screen, int param)
61 {
62 switch (param) {
63 case PIPE_CAP_MAX_LINE_WIDTH:
64 case PIPE_CAP_MAX_LINE_WIDTH_AA:
65 return 10.0;
66 case PIPE_CAP_MAX_POINT_WIDTH:
67 case PIPE_CAP_MAX_POINT_WIDTH_AA:
68 return 64.0;
69 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
70 return 16.0;
71 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
72 return 4.0;
73 case PIPE_CAP_BITMAP_TEXCOORD_BIAS:
74 return 0.0;
75 default:
76 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
77 return 0.0;
78 }
79 }
80
81 static boolean
82 nv30_screen_is_format_supported(struct pipe_screen *screen,
83 enum pipe_format format, uint type)
84 {
85 switch (type) {
86 case PIPE_SURFACE:
87 switch (format) {
88 case PIPE_FORMAT_A8R8G8B8_UNORM:
89 case PIPE_FORMAT_R5G6B5_UNORM:
90 case PIPE_FORMAT_Z24S8_UNORM:
91 case PIPE_FORMAT_Z16_UNORM:
92 return TRUE;
93 default:
94 break;
95 }
96 break;
97 case PIPE_TEXTURE:
98 switch (format) {
99 case PIPE_FORMAT_A8R8G8B8_UNORM:
100 case PIPE_FORMAT_A1R5G5B5_UNORM:
101 case PIPE_FORMAT_A4R4G4B4_UNORM:
102 case PIPE_FORMAT_R5G6B5_UNORM:
103 case PIPE_FORMAT_U_L8:
104 case PIPE_FORMAT_U_A8:
105 case PIPE_FORMAT_U_I8:
106 case PIPE_FORMAT_U_A8_L8:
107 case PIPE_FORMAT_Z16_UNORM:
108 case PIPE_FORMAT_Z24S8_UNORM:
109 return TRUE;
110 default:
111 break;
112 }
113 break;
114 default:
115 assert(0);
116 };
117
118 return FALSE;
119 }
120
121 static void
122 nv30_screen_destroy(struct pipe_screen *screen)
123 {
124 FREE(screen);
125 }
126
127 struct pipe_screen *
128 nv30_screen_create(struct pipe_winsys *winsys, unsigned chipset)
129 {
130 struct nv30_screen *nv30screen = CALLOC_STRUCT(nv30_screen);
131
132 if (!nv30screen)
133 return NULL;
134
135 nv30screen->chipset = chipset;
136
137 nv30screen->screen.winsys = winsys;
138
139 nv30screen->screen.destroy = nv30_screen_destroy;
140
141 nv30screen->screen.get_name = nv30_screen_get_name;
142 nv30screen->screen.get_vendor = nv30_screen_get_vendor;
143 nv30screen->screen.get_param = nv30_screen_get_param;
144 nv30screen->screen.get_paramf = nv30_screen_get_paramf;
145 nv30screen->screen.is_format_supported =
146 nv30_screen_is_format_supported;
147
148 nv30_init_miptree_functions(&nv30screen->screen);
149 return &nv30screen->screen;
150 }
151