Merge branch 'vbo_clean'
[mesa.git] / src / gallium / drivers / identity / id_drm.c
1 /**************************************************************************
2 *
3 * Copyright 2009 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #include "state_tracker/drm_api.h"
29
30 #include "util/u_memory.h"
31 #include "identity/id_drm.h"
32 #include "identity/id_public.h"
33 #include "identity/id_screen.h"
34 #include "identity/id_objects.h"
35
36 struct identity_drm_api
37 {
38 struct drm_api base;
39
40 struct drm_api *api;
41 };
42
43 static INLINE struct identity_drm_api *
44 identity_drm_api(struct drm_api *_api)
45 {
46 return (struct identity_drm_api *)_api;
47 }
48
49 static struct pipe_screen *
50 identity_drm_create_screen(struct drm_api *_api, int fd,
51 struct drm_create_screen_arg *arg)
52 {
53 struct identity_drm_api *id_api = identity_drm_api(_api);
54 struct drm_api *api = id_api->api;
55 struct pipe_screen *screen;
56
57 if (arg && arg->mode != DRM_CREATE_NORMAL)
58 return NULL;
59
60 screen = api->create_screen(api, fd, arg);
61
62 return identity_screen_create(screen);
63 }
64
65 static struct pipe_context *
66 identity_drm_create_context(struct drm_api *_api,
67 struct pipe_screen *_screen)
68 {
69 struct identity_screen *id_screen = identity_screen(_screen);
70 struct identity_drm_api *id_api = identity_drm_api(_api);
71 struct pipe_screen *screen = id_screen->screen;
72 struct drm_api *api = id_api->api;
73 struct pipe_context *pipe;
74
75 pipe = api->create_context(api, screen);
76
77 pipe = identity_context_create(_screen, pipe);
78
79 return pipe;
80 }
81
82 static boolean
83 identity_drm_buffer_from_texture(struct drm_api *_api,
84 struct pipe_texture *_texture,
85 struct pipe_buffer **_buffer,
86 unsigned *stride)
87 {
88 struct identity_texture *id_texture = identity_texture(_texture);
89 struct identity_drm_api *id_api = identity_drm_api(_api);
90 struct pipe_texture *texture = id_texture->texture;
91 struct drm_api *api = id_api->api;
92 struct pipe_buffer *buffer = NULL;
93 boolean result;
94
95 result = api->buffer_from_texture(api, texture, &buffer, stride);
96
97 if (result && _buffer)
98 buffer = identity_buffer_create(identity_screen(texture->screen), buffer);
99
100 if (_buffer)
101 *_buffer = buffer;
102 else
103 pipe_buffer_reference(&buffer, NULL);
104
105 return result;
106 }
107
108 static struct pipe_buffer *
109 identity_drm_buffer_from_handle(struct drm_api *_api,
110 struct pipe_screen *_screen,
111 const char *name,
112 unsigned handle)
113 {
114 struct identity_screen *id_screen = identity_screen(_screen);
115 struct identity_drm_api *id_api = identity_drm_api(_api);
116 struct pipe_screen *screen = id_screen->screen;
117 struct drm_api *api = id_api->api;
118 struct pipe_buffer *result;
119
120 result = api->buffer_from_handle(api, screen, name, handle);
121
122 result = identity_buffer_create(identity_screen(_screen), result);
123
124 return result;
125 }
126
127 static boolean
128 identity_drm_handle_from_buffer(struct drm_api *_api,
129 struct pipe_screen *_screen,
130 struct pipe_buffer *_buffer,
131 unsigned *handle)
132 {
133 struct identity_screen *id_screen = identity_screen(_screen);
134 struct identity_buffer *id_buffer = identity_buffer(_buffer);
135 struct identity_drm_api *id_api = identity_drm_api(_api);
136 struct pipe_screen *screen = id_screen->screen;
137 struct pipe_buffer *buffer = id_buffer->buffer;
138 struct drm_api *api = id_api->api;
139
140 return api->handle_from_buffer(api, screen, buffer, handle);
141 }
142
143 static boolean
144 identity_drm_global_handle_from_buffer(struct drm_api *_api,
145 struct pipe_screen *_screen,
146 struct pipe_buffer *_buffer,
147 unsigned *handle)
148 {
149 struct identity_screen *id_screen = identity_screen(_screen);
150 struct identity_buffer *id_buffer = identity_buffer(_buffer);
151 struct identity_drm_api *id_api = identity_drm_api(_api);
152 struct pipe_screen *screen = id_screen->screen;
153 struct pipe_buffer *buffer = id_buffer->buffer;
154 struct drm_api *api = id_api->api;
155
156 return api->global_handle_from_buffer(api, screen, buffer, handle);
157 }
158
159 static void
160 identity_drm_destroy(struct drm_api *_api)
161 {
162 struct identity_drm_api *id_api = identity_drm_api(_api);
163 struct drm_api *api = id_api->api;
164 api->destroy(api);
165
166 free(id_api);
167 }
168
169 struct drm_api *
170 identity_drm_create(struct drm_api *api)
171 {
172 struct identity_drm_api *id_api = CALLOC_STRUCT(identity_drm_api);
173
174 if (!id_api)
175 return NULL;
176
177 id_api->base.create_screen = identity_drm_create_screen;
178 id_api->base.create_context = identity_drm_create_context;
179 id_api->base.buffer_from_texture = identity_drm_buffer_from_texture;
180 id_api->base.buffer_from_handle = identity_drm_buffer_from_handle;
181 id_api->base.handle_from_buffer = identity_drm_handle_from_buffer;
182 id_api->base.global_handle_from_buffer = identity_drm_global_handle_from_buffer;
183 id_api->base.destroy = identity_drm_destroy;
184 id_api->api = api;
185
186 return &id_api->base;
187 }