2 #include "state_tracker/drm_driver.h"
3 #include "i915_drm_winsys.h"
4 #include "util/u_memory.h"
8 static char *i915_drm_type_to_name(enum i915_winsys_buffer_type type
)
12 if (type
== I915_NEW_TEXTURE
) {
13 name
= "gallium3d_texture";
14 } else if (type
== I915_NEW_VERTEX
) {
15 name
= "gallium3d_vertex";
16 } else if (type
== I915_NEW_SCANOUT
) {
17 name
= "gallium3d_scanout";
20 name
= "gallium3d_unknown";
26 static struct i915_winsys_buffer
*
27 i915_drm_buffer_create(struct i915_winsys
*iws
,
29 enum i915_winsys_buffer_type type
)
31 struct i915_drm_buffer
*buf
= CALLOC_STRUCT(i915_drm_buffer
);
32 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
37 buf
->magic
= 0xDEAD1337;
41 buf
->bo
= drm_intel_bo_alloc(idws
->gem_manager
,
42 i915_drm_type_to_name(type
), size
, 0);
47 return (struct i915_winsys_buffer
*)buf
;
55 static struct i915_winsys_buffer
*
56 i915_drm_buffer_create_tiled(struct i915_winsys
*iws
,
57 unsigned *stride
, unsigned height
,
58 enum i915_winsys_buffer_tile
*tiling
,
59 enum i915_winsys_buffer_type type
)
61 struct i915_drm_buffer
*buf
= CALLOC_STRUCT(i915_drm_buffer
);
62 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
63 unsigned long pitch
= 0;
64 uint32_t tiling_mode
= *tiling
;
69 buf
->magic
= 0xDEAD1337;
73 buf
->bo
= drm_intel_bo_alloc_tiled(idws
->gem_manager
,
74 i915_drm_type_to_name(type
),
76 &tiling_mode
, &pitch
, 0);
82 *tiling
= tiling_mode
;
83 return (struct i915_winsys_buffer
*)buf
;
91 static struct i915_winsys_buffer
*
92 i915_drm_buffer_from_handle(struct i915_winsys
*iws
,
93 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
!= DRM_API_HANDLE_TYPE_SHARED
)
104 buf
= CALLOC_STRUCT(i915_drm_buffer
);
108 buf
->magic
= 0xDEAD1337;
109 buf
->bo
= drm_intel_bo_gem_create_from_name(idws
->gem_manager
, "gallium3d_from_handle", whandle
->handle
);
111 buf
->flink
= whandle
->handle
;
116 drm_intel_bo_get_tiling(buf
->bo
, &tile
, &swizzle
);
118 *stride
= whandle
->stride
;
121 return (struct i915_winsys_buffer
*)buf
;
129 i915_drm_buffer_get_handle(struct i915_winsys
*iws
,
130 struct i915_winsys_buffer
*buffer
,
131 struct winsys_handle
*whandle
,
134 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
136 if (whandle
->type
== DRM_API_HANDLE_TYPE_SHARED
) {
138 if (drm_intel_bo_flink(buf
->bo
, &buf
->flink
))
143 whandle
->handle
= buf
->flink
;
144 } else if (whandle
->type
== DRM_API_HANDLE_TYPE_KMS
) {
145 whandle
->handle
= buf
->bo
->handle
;
147 assert(!"unknown usage");
151 whandle
->stride
= stride
;
156 i915_drm_buffer_map(struct i915_winsys
*iws
,
157 struct i915_winsys_buffer
*buffer
,
160 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
161 drm_intel_bo
*bo
= intel_bo(buffer
);
169 ret
= drm_intel_gem_bo_map_gtt(bo
);
171 buf
->ptr
= bo
->virtual;
183 i915_drm_buffer_unmap(struct i915_winsys
*iws
,
184 struct i915_winsys_buffer
*buffer
)
186 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
188 if (--buf
->map_count
)
191 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer
));
195 i915_drm_buffer_write(struct i915_winsys
*iws
,
196 struct i915_winsys_buffer
*buffer
,
201 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
203 return drm_intel_bo_subdata(buf
->bo
, offset
, size
, (void*)data
);
207 i915_drm_buffer_destroy(struct i915_winsys
*iws
,
208 struct i915_winsys_buffer
*buffer
)
210 drm_intel_bo_unreference(intel_bo(buffer
));
213 i915_drm_buffer(buffer
)->magic
= 0;
214 i915_drm_buffer(buffer
)->bo
= NULL
;
221 i915_drm_buffer_is_busy(struct i915_winsys
*iws
,
222 struct i915_winsys_buffer
*buffer
)
224 struct i915_drm_buffer
* i915_buffer
= i915_drm_buffer(buffer
);
227 return drm_intel_bo_busy(i915_buffer
->bo
);
232 i915_drm_winsys_init_buffer_functions(struct i915_drm_winsys
*idws
)
234 idws
->base
.buffer_create
= i915_drm_buffer_create
;
235 idws
->base
.buffer_create_tiled
= i915_drm_buffer_create_tiled
;
236 idws
->base
.buffer_from_handle
= i915_drm_buffer_from_handle
;
237 idws
->base
.buffer_get_handle
= i915_drm_buffer_get_handle
;
238 idws
->base
.buffer_map
= i915_drm_buffer_map
;
239 idws
->base
.buffer_unmap
= i915_drm_buffer_unmap
;
240 idws
->base
.buffer_write
= i915_drm_buffer_write
;
241 idws
->base
.buffer_destroy
= i915_drm_buffer_destroy
;
242 idws
->base
.buffer_is_busy
= i915_drm_buffer_is_busy
;