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
,
96 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
97 struct i915_drm_buffer
*buf
= CALLOC_STRUCT(i915_drm_buffer
);
98 uint32_t tile
= 0, swizzle
= 0;
103 buf
->magic
= 0xDEAD1337;
104 buf
->bo
= drm_intel_bo_gem_create_from_name(idws
->gem_manager
, "gallium3d_from_handle", whandle
->handle
);
106 buf
->flink
= whandle
->handle
;
111 drm_intel_bo_get_tiling(buf
->bo
, &tile
, &swizzle
);
113 *stride
= whandle
->stride
;
115 return (struct i915_winsys_buffer
*)buf
;
123 i915_drm_buffer_get_handle(struct i915_winsys
*iws
,
124 struct i915_winsys_buffer
*buffer
,
125 struct winsys_handle
*whandle
,
128 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
130 if (whandle
->type
== DRM_API_HANDLE_TYPE_SHARED
) {
132 if (drm_intel_bo_flink(buf
->bo
, &buf
->flink
))
137 whandle
->handle
= buf
->flink
;
138 } else if (whandle
->type
== DRM_API_HANDLE_TYPE_KMS
) {
139 whandle
->handle
= buf
->bo
->handle
;
141 assert(!"unknown usage");
145 whandle
->stride
= stride
;
150 i915_drm_buffer_set_fence_reg(struct i915_winsys
*iws
,
151 struct i915_winsys_buffer
*buffer
,
153 enum i915_winsys_buffer_tile tile
)
155 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
156 assert(I915_TILING_NONE
== I915_TILE_NONE
);
157 assert(I915_TILING_X
== I915_TILE_X
);
158 assert(I915_TILING_Y
== I915_TILE_Y
);
160 if (tile
!= I915_TILE_NONE
) {
161 assert(buf
->map_count
== 0);
164 return drm_intel_bo_set_tiling(buf
->bo
, &tile
, stride
);
168 i915_drm_buffer_map(struct i915_winsys
*iws
,
169 struct i915_winsys_buffer
*buffer
,
172 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
173 drm_intel_bo
*bo
= intel_bo(buffer
);
181 ret
= drm_intel_gem_bo_map_gtt(bo
);
183 buf
->ptr
= bo
->virtual;
195 i915_drm_buffer_unmap(struct i915_winsys
*iws
,
196 struct i915_winsys_buffer
*buffer
)
198 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
200 if (--buf
->map_count
)
203 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer
));
207 i915_drm_buffer_write(struct i915_winsys
*iws
,
208 struct i915_winsys_buffer
*buffer
,
213 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
215 return drm_intel_bo_subdata(buf
->bo
, offset
, size
, (void*)data
);
219 i915_drm_buffer_destroy(struct i915_winsys
*iws
,
220 struct i915_winsys_buffer
*buffer
)
222 drm_intel_bo_unreference(intel_bo(buffer
));
225 i915_drm_buffer(buffer
)->magic
= 0;
226 i915_drm_buffer(buffer
)->bo
= NULL
;
233 i915_drm_winsys_init_buffer_functions(struct i915_drm_winsys
*idws
)
235 idws
->base
.buffer_create
= i915_drm_buffer_create
;
236 idws
->base
.buffer_create_tiled
= i915_drm_buffer_create_tiled
;
237 idws
->base
.buffer_from_handle
= i915_drm_buffer_from_handle
;
238 idws
->base
.buffer_get_handle
= i915_drm_buffer_get_handle
;
239 idws
->base
.buffer_set_fence_reg
= i915_drm_buffer_set_fence_reg
;
240 idws
->base
.buffer_map
= i915_drm_buffer_map
;
241 idws
->base
.buffer_unmap
= i915_drm_buffer_unmap
;
242 idws
->base
.buffer_write
= i915_drm_buffer_write
;
243 idws
->base
.buffer_destroy
= i915_drm_buffer_destroy
;