Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / drivers / galahad / glhd_screen.c
1 /**************************************************************************
2  *
3  * Copyright 2009 VMware, Inc.
4  * 2010 Corbin Simpson <MostAwesomeDude@gmail.com>
5  * All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  **************************************************************************/
28
29
30 #include "pipe/p_screen.h"
31 #include "pipe/p_state.h"
32 #include "util/u_memory.h"
33 #include "util/u_math.h"
34
35 #include "glhd_public.h"
36 #include "glhd_screen.h"
37 #include "glhd_context.h"
38 #include "glhd_objects.h"
39
40 DEBUG_GET_ONCE_BOOL_OPTION(galahad, "GALLIUM_GALAHAD", FALSE)
41
42 static void
43 galahad_screen_destroy(struct pipe_screen *_screen)
44 {
45    struct galahad_screen *glhd_screen = galahad_screen(_screen);
46    struct pipe_screen *screen = glhd_screen->screen;
47
48    screen->destroy(screen);
49
50    FREE(glhd_screen);
51 }
52
53 static const char *
54 galahad_screen_get_name(struct pipe_screen *_screen)
55 {
56    struct galahad_screen *glhd_screen = galahad_screen(_screen);
57    struct pipe_screen *screen = glhd_screen->screen;
58
59    return screen->get_name(screen);
60 }
61
62 static const char *
63 galahad_screen_get_vendor(struct pipe_screen *_screen)
64 {
65    struct galahad_screen *glhd_screen = galahad_screen(_screen);
66    struct pipe_screen *screen = glhd_screen->screen;
67
68    return screen->get_vendor(screen);
69 }
70
71 static int
72 galahad_screen_get_param(struct pipe_screen *_screen,
73                           enum pipe_cap param)
74 {
75    struct galahad_screen *glhd_screen = galahad_screen(_screen);
76    struct pipe_screen *screen = glhd_screen->screen;
77
78    return screen->get_param(screen,
79                             param);
80 }
81
82 static int
83 galahad_screen_get_shader_param(struct pipe_screen *_screen,
84                           unsigned shader, enum pipe_shader_cap param)
85 {
86    struct galahad_screen *glhd_screen = galahad_screen(_screen);
87    struct pipe_screen *screen = glhd_screen->screen;
88
89    return screen->get_shader_param(screen, shader,
90                             param);
91 }
92
93 static float
94 galahad_screen_get_paramf(struct pipe_screen *_screen,
95                            enum pipe_cap param)
96 {
97    struct galahad_screen *glhd_screen = galahad_screen(_screen);
98    struct pipe_screen *screen = glhd_screen->screen;
99
100    return screen->get_paramf(screen,
101                              param);
102 }
103
104 static boolean
105 galahad_screen_is_format_supported(struct pipe_screen *_screen,
106                                     enum pipe_format format,
107                                     enum pipe_texture_target target,
108                                     unsigned sample_count,
109                                     unsigned tex_usage)
110 {
111    struct galahad_screen *glhd_screen = galahad_screen(_screen);
112    struct pipe_screen *screen = glhd_screen->screen;
113
114    if (target >= PIPE_MAX_TEXTURE_TYPES) {
115       glhd_warn("Received bogus texture target %d", target);
116    }
117
118    return screen->is_format_supported(screen,
119                                       format,
120                                       target,
121                                       sample_count,
122                                       tex_usage);
123 }
124
125 static struct pipe_context *
126 galahad_screen_context_create(struct pipe_screen *_screen,
127                                void *priv)
128 {
129    struct galahad_screen *glhd_screen = galahad_screen(_screen);
130    struct pipe_screen *screen = glhd_screen->screen;
131    struct pipe_context *result;
132
133    result = screen->context_create(screen, priv);
134    if (result)
135       return galahad_context_create(_screen, result);
136    return NULL;
137 }
138
139 static struct pipe_resource *
140 galahad_screen_resource_create(struct pipe_screen *_screen,
141                                 const struct pipe_resource *templat)
142 {
143    struct galahad_screen *glhd_screen = galahad_screen(_screen);
144    struct pipe_screen *screen = glhd_screen->screen;
145    struct pipe_resource *result;
146
147    if (templat->target >= PIPE_MAX_TEXTURE_TYPES)
148       glhd_warn("Received bogus resource target %d", templat->target);
149
150    if(templat->target != PIPE_TEXTURE_RECT && templat->target != PIPE_BUFFER && !screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES))
151    {
152       if(!util_is_power_of_two(templat->width0) || !util_is_power_of_two(templat->height0))
153          glhd_warn("Requested NPOT (%ux%u) non-rectangle texture without NPOT support", templat->width0, templat->height0);
154    }
155
156    if(templat->target == PIPE_TEXTURE_RECT && templat->last_level)
157       glhd_warn("Rectangle textures cannot have mipmaps, but last_level = %u", templat->last_level);
158
159    if(templat->target == PIPE_BUFFER && templat->last_level)
160       glhd_warn("Buffers cannot have mipmaps, but last_level = %u", templat->last_level);
161
162    if(templat->target != PIPE_TEXTURE_3D && templat->depth0 != 1)
163       glhd_warn("Only 3D textures can have depth != 1, but received target %u and depth %u", templat->target, templat->depth0);
164
165    if(templat->target == PIPE_TEXTURE_1D && templat->height0 != 1)
166      glhd_warn("1D textures must have height 1 but got asked for height %u", templat->height0);
167
168    if(templat->target == PIPE_BUFFER && templat->height0 != 1)
169      glhd_warn("Buffers must have height 1 but got asked for height %u", templat->height0);
170
171    if(templat->target == PIPE_TEXTURE_CUBE && templat->width0 != templat->height0)
172       glhd_warn("Cube maps must be square, but got asked for %ux%u", templat->width0, templat->height0);
173
174    result = screen->resource_create(screen,
175                                     templat);
176
177    if (result)
178       return galahad_resource_create(glhd_screen, result);
179    return NULL;
180 }
181
182 static struct pipe_resource *
183 galahad_screen_resource_from_handle(struct pipe_screen *_screen,
184                                      const struct pipe_resource *templ,
185                                      struct winsys_handle *handle)
186 {
187    struct galahad_screen *glhd_screen = galahad_screen(_screen);
188    struct pipe_screen *screen = glhd_screen->screen;
189    struct pipe_resource *result;
190
191    /* TODO trace call */
192
193    result = screen->resource_from_handle(screen, templ, handle);
194
195    result = galahad_resource_create(galahad_screen(_screen), result);
196
197    return result;
198 }
199
200 static boolean
201 galahad_screen_resource_get_handle(struct pipe_screen *_screen,
202                                     struct pipe_resource *_resource,
203                                     struct winsys_handle *handle)
204 {
205    struct galahad_screen *glhd_screen = galahad_screen(_screen);
206    struct galahad_resource *glhd_resource = galahad_resource(_resource);
207    struct pipe_screen *screen = glhd_screen->screen;
208    struct pipe_resource *resource = glhd_resource->resource;
209
210    /* TODO trace call */
211
212    return screen->resource_get_handle(screen, resource, handle);
213 }
214
215
216
217 static void
218 galahad_screen_resource_destroy(struct pipe_screen *screen,
219                                  struct pipe_resource *_resource)
220 {
221    galahad_resource_destroy(galahad_resource(_resource));
222 }
223
224
225 static struct pipe_resource *
226 galahad_screen_user_buffer_create(struct pipe_screen *_screen,
227                                    void *ptr,
228                                    unsigned bytes,
229                                    unsigned usage)
230 {
231    struct galahad_screen *glhd_screen = galahad_screen(_screen);
232    struct pipe_screen *screen = glhd_screen->screen;
233    struct pipe_resource *result;
234
235    result = screen->user_buffer_create(screen,
236                                        ptr,
237                                        bytes,
238                                        usage);
239
240    if (result)
241       return galahad_resource_create(glhd_screen, result);
242    return NULL;
243 }
244
245
246
247 static void
248 galahad_screen_flush_frontbuffer(struct pipe_screen *_screen,
249                                   struct pipe_resource *_resource,
250                                   unsigned level, unsigned layer,
251                                   void *context_private)
252 {
253    struct galahad_screen *glhd_screen = galahad_screen(_screen);
254    struct galahad_resource *glhd_resource = galahad_resource(_resource);
255    struct pipe_screen *screen = glhd_screen->screen;
256    struct pipe_resource *resource = glhd_resource->resource;
257
258    screen->flush_frontbuffer(screen,
259                              resource,
260                              level, layer,
261                              context_private);
262 }
263
264 static void
265 galahad_screen_fence_reference(struct pipe_screen *_screen,
266                                 struct pipe_fence_handle **ptr,
267                                 struct pipe_fence_handle *fence)
268 {
269    struct galahad_screen *glhd_screen = galahad_screen(_screen);
270    struct pipe_screen *screen = glhd_screen->screen;
271
272    screen->fence_reference(screen,
273                            ptr,
274                            fence);
275 }
276
277 static boolean
278 galahad_screen_fence_signalled(struct pipe_screen *_screen,
279                                 struct pipe_fence_handle *fence)
280 {
281    struct galahad_screen *glhd_screen = galahad_screen(_screen);
282    struct pipe_screen *screen = glhd_screen->screen;
283
284    return screen->fence_signalled(screen,
285                                   fence);
286 }
287
288 static boolean
289 galahad_screen_fence_finish(struct pipe_screen *_screen,
290                              struct pipe_fence_handle *fence,
291                              uint64_t timeout)
292 {
293    struct galahad_screen *glhd_screen = galahad_screen(_screen);
294    struct pipe_screen *screen = glhd_screen->screen;
295
296    return screen->fence_finish(screen,
297                                fence,
298                                timeout);
299 }
300
301 struct pipe_screen *
302 galahad_screen_create(struct pipe_screen *screen)
303 {
304    struct galahad_screen *glhd_screen;
305
306    if (!debug_get_option_galahad())
307       return screen;
308
309    glhd_screen = CALLOC_STRUCT(galahad_screen);
310    if (!glhd_screen) {
311       return screen;
312    }
313
314    glhd_screen->base.winsys = NULL;
315
316    glhd_screen->base.destroy = galahad_screen_destroy;
317    glhd_screen->base.get_name = galahad_screen_get_name;
318    glhd_screen->base.get_vendor = galahad_screen_get_vendor;
319    glhd_screen->base.get_param = galahad_screen_get_param;
320    glhd_screen->base.get_shader_param = galahad_screen_get_shader_param;
321    glhd_screen->base.get_paramf = galahad_screen_get_paramf;
322    glhd_screen->base.is_format_supported = galahad_screen_is_format_supported;
323    glhd_screen->base.context_create = galahad_screen_context_create;
324    glhd_screen->base.resource_create = galahad_screen_resource_create;
325    glhd_screen->base.resource_from_handle = galahad_screen_resource_from_handle;
326    glhd_screen->base.resource_get_handle = galahad_screen_resource_get_handle;
327    glhd_screen->base.resource_destroy = galahad_screen_resource_destroy;
328    glhd_screen->base.user_buffer_create = galahad_screen_user_buffer_create;
329    glhd_screen->base.flush_frontbuffer = galahad_screen_flush_frontbuffer;
330    glhd_screen->base.fence_reference = galahad_screen_fence_reference;
331    glhd_screen->base.fence_signalled = galahad_screen_fence_signalled;
332    glhd_screen->base.fence_finish = galahad_screen_fence_finish;
333
334    glhd_screen->screen = screen;
335
336    glhd_warn("Created screen %p", (void *) glhd_screen);
337
338    return &glhd_screen->base;
339 }