1 #include "frontend/drm_driver.h"
2 #include "i915_drm_winsys.h"
3 #include "util/u_memory.h"
5 #include "drm-uapi/i915_drm.h"
7 static char *i915_drm_type_to_name(enum i915_winsys_buffer_type type
)
11 if (type
== I915_NEW_TEXTURE
) {
12 name
= "gallium3d_texture";
13 } else if (type
== I915_NEW_VERTEX
) {
14 name
= "gallium3d_vertex";
15 } else if (type
== I915_NEW_SCANOUT
) {
16 name
= "gallium3d_scanout";
19 name
= "gallium3d_unknown";
25 static struct i915_winsys_buffer
*
26 i915_drm_buffer_create(struct i915_winsys
*iws
,
28 enum i915_winsys_buffer_type type
)
30 struct i915_drm_buffer
*buf
= CALLOC_STRUCT(i915_drm_buffer
);
31 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
36 buf
->magic
= 0xDEAD1337;
40 buf
->bo
= drm_intel_bo_alloc(idws
->gem_manager
,
41 i915_drm_type_to_name(type
), size
, 0);
46 return (struct i915_winsys_buffer
*)buf
;
54 static struct i915_winsys_buffer
*
55 i915_drm_buffer_create_tiled(struct i915_winsys
*iws
,
56 unsigned *stride
, unsigned height
,
57 enum i915_winsys_buffer_tile
*tiling
,
58 enum i915_winsys_buffer_type type
)
60 struct i915_drm_buffer
*buf
= CALLOC_STRUCT(i915_drm_buffer
);
61 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
62 unsigned long pitch
= 0;
63 uint32_t tiling_mode
= *tiling
;
68 buf
->magic
= 0xDEAD1337;
72 buf
->bo
= drm_intel_bo_alloc_tiled(idws
->gem_manager
,
73 i915_drm_type_to_name(type
),
75 &tiling_mode
, &pitch
, 0);
81 *tiling
= tiling_mode
;
82 return (struct i915_winsys_buffer
*)buf
;
90 static struct i915_winsys_buffer
*
91 i915_drm_buffer_from_handle(struct i915_winsys
*iws
,
92 struct winsys_handle
*whandle
,
94 enum i915_winsys_buffer_tile
*tiling
,
97 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
98 struct i915_drm_buffer
*buf
;
99 uint32_t tile
= 0, swizzle
= 0;
101 if ((whandle
->type
!= WINSYS_HANDLE_TYPE_SHARED
) && (whandle
->type
!= WINSYS_HANDLE_TYPE_FD
))
104 if (whandle
->offset
!= 0)
107 buf
= CALLOC_STRUCT(i915_drm_buffer
);
111 buf
->magic
= 0xDEAD1337;
113 if (whandle
->type
== WINSYS_HANDLE_TYPE_SHARED
)
114 buf
->bo
= drm_intel_bo_gem_create_from_name(idws
->gem_manager
, "gallium3d_from_handle", whandle
->handle
);
115 else if (whandle
->type
== WINSYS_HANDLE_TYPE_FD
) {
116 int fd
= (int) whandle
->handle
;
117 buf
->bo
= drm_intel_bo_gem_create_from_prime(idws
->gem_manager
, fd
, height
* whandle
->stride
);
121 buf
->flink
= whandle
->handle
;
126 drm_intel_bo_get_tiling(buf
->bo
, &tile
, &swizzle
);
128 *stride
= whandle
->stride
;
131 return (struct i915_winsys_buffer
*)buf
;
139 i915_drm_buffer_get_handle(struct i915_winsys
*iws
,
140 struct i915_winsys_buffer
*buffer
,
141 struct winsys_handle
*whandle
,
144 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
146 if (whandle
->type
== WINSYS_HANDLE_TYPE_SHARED
) {
148 if (drm_intel_bo_flink(buf
->bo
, &buf
->flink
))
153 whandle
->handle
= buf
->flink
;
154 } else if (whandle
->type
== WINSYS_HANDLE_TYPE_KMS
) {
155 whandle
->handle
= buf
->bo
->handle
;
156 } else if (whandle
->type
== WINSYS_HANDLE_TYPE_FD
) {
159 if (drm_intel_bo_gem_export_to_prime(buf
->bo
, &fd
))
161 whandle
->handle
= fd
;
163 assert(!"unknown usage");
167 whandle
->stride
= stride
;
172 i915_drm_buffer_map(struct i915_winsys
*iws
,
173 struct i915_winsys_buffer
*buffer
,
176 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
177 drm_intel_bo
*bo
= intel_bo(buffer
);
185 ret
= drm_intel_gem_bo_map_gtt(bo
);
187 buf
->ptr
= bo
->virtual;
199 i915_drm_buffer_unmap(struct i915_winsys
*iws
,
200 struct i915_winsys_buffer
*buffer
)
202 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
204 if (--buf
->map_count
)
207 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer
));
211 i915_drm_buffer_write(struct i915_winsys
*iws
,
212 struct i915_winsys_buffer
*buffer
,
217 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
219 return drm_intel_bo_subdata(buf
->bo
, offset
, size
, (void*)data
);
223 i915_drm_buffer_destroy(struct i915_winsys
*iws
,
224 struct i915_winsys_buffer
*buffer
)
226 drm_intel_bo_unreference(intel_bo(buffer
));
229 i915_drm_buffer(buffer
)->magic
= 0;
230 i915_drm_buffer(buffer
)->bo
= NULL
;
237 i915_drm_buffer_is_busy(struct i915_winsys
*iws
,
238 struct i915_winsys_buffer
*buffer
)
240 struct i915_drm_buffer
* i915_buffer
= i915_drm_buffer(buffer
);
243 return drm_intel_bo_busy(i915_buffer
->bo
);
248 i915_drm_winsys_init_buffer_functions(struct i915_drm_winsys
*idws
)
250 idws
->base
.buffer_create
= i915_drm_buffer_create
;
251 idws
->base
.buffer_create_tiled
= i915_drm_buffer_create_tiled
;
252 idws
->base
.buffer_from_handle
= i915_drm_buffer_from_handle
;
253 idws
->base
.buffer_get_handle
= i915_drm_buffer_get_handle
;
254 idws
->base
.buffer_map
= i915_drm_buffer_map
;
255 idws
->base
.buffer_unmap
= i915_drm_buffer_unmap
;
256 idws
->base
.buffer_write
= i915_drm_buffer_write
;
257 idws
->base
.buffer_destroy
= i915_drm_buffer_destroy
;
258 idws
->base
.buffer_is_busy
= i915_drm_buffer_is_busy
;