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
= CALLOC_STRUCT(i915_drm_buffer
);
99 uint32_t tile
= 0, swizzle
= 0;
104 buf
->magic
= 0xDEAD1337;
105 buf
->bo
= drm_intel_bo_gem_create_from_name(idws
->gem_manager
, "gallium3d_from_handle", whandle
->handle
);
107 buf
->flink
= whandle
->handle
;
112 drm_intel_bo_get_tiling(buf
->bo
, &tile
, &swizzle
);
114 *stride
= whandle
->stride
;
117 return (struct i915_winsys_buffer
*)buf
;
125 i915_drm_buffer_get_handle(struct i915_winsys
*iws
,
126 struct i915_winsys_buffer
*buffer
,
127 struct winsys_handle
*whandle
,
130 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
132 if (whandle
->type
== DRM_API_HANDLE_TYPE_SHARED
) {
134 if (drm_intel_bo_flink(buf
->bo
, &buf
->flink
))
139 whandle
->handle
= buf
->flink
;
140 } else if (whandle
->type
== DRM_API_HANDLE_TYPE_KMS
) {
141 whandle
->handle
= buf
->bo
->handle
;
143 assert(!"unknown usage");
147 whandle
->stride
= stride
;
152 i915_drm_buffer_map(struct i915_winsys
*iws
,
153 struct i915_winsys_buffer
*buffer
,
156 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
157 drm_intel_bo
*bo
= intel_bo(buffer
);
165 ret
= drm_intel_gem_bo_map_gtt(bo
);
167 buf
->ptr
= bo
->virtual;
179 i915_drm_buffer_unmap(struct i915_winsys
*iws
,
180 struct i915_winsys_buffer
*buffer
)
182 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
184 if (--buf
->map_count
)
187 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer
));
191 i915_drm_buffer_write(struct i915_winsys
*iws
,
192 struct i915_winsys_buffer
*buffer
,
197 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
199 return drm_intel_bo_subdata(buf
->bo
, offset
, size
, (void*)data
);
203 i915_drm_buffer_destroy(struct i915_winsys
*iws
,
204 struct i915_winsys_buffer
*buffer
)
206 drm_intel_bo_unreference(intel_bo(buffer
));
209 i915_drm_buffer(buffer
)->magic
= 0;
210 i915_drm_buffer(buffer
)->bo
= NULL
;
217 i915_drm_buffer_is_busy(struct i915_winsys
*iws
,
218 struct i915_winsys_buffer
*buffer
)
220 struct i915_drm_buffer
* i915_buffer
= i915_drm_buffer(buffer
);
223 return drm_intel_bo_busy(i915_buffer
->bo
);
228 i915_drm_winsys_init_buffer_functions(struct i915_drm_winsys
*idws
)
230 idws
->base
.buffer_create
= i915_drm_buffer_create
;
231 idws
->base
.buffer_create_tiled
= i915_drm_buffer_create_tiled
;
232 idws
->base
.buffer_from_handle
= i915_drm_buffer_from_handle
;
233 idws
->base
.buffer_get_handle
= i915_drm_buffer_get_handle
;
234 idws
->base
.buffer_map
= i915_drm_buffer_map
;
235 idws
->base
.buffer_unmap
= i915_drm_buffer_unmap
;
236 idws
->base
.buffer_write
= i915_drm_buffer_write
;
237 idws
->base
.buffer_destroy
= i915_drm_buffer_destroy
;
238 idws
->base
.buffer_is_busy
= i915_drm_buffer_is_busy
;