2 #include "state_tracker/drm_api.h"
3 #include "i915_drm_winsys.h"
4 #include "util/u_memory.h"
8 static struct i915_winsys_buffer
*
9 i915_drm_buffer_create(struct i915_winsys
*iws
,
10 unsigned size
, unsigned alignment
,
11 enum i915_winsys_buffer_type type
)
13 struct i915_drm_buffer
*buf
= CALLOC_STRUCT(i915_drm_buffer
);
14 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
15 drm_intel_bufmgr
*pool
;
21 buf
->magic
= 0xDEAD1337;
26 if (type
== I915_NEW_TEXTURE
) {
27 name
= "gallium3d_texture";
28 pool
= idws
->pools
.gem
;
29 } else if (type
== I915_NEW_VERTEX
) {
30 name
= "gallium3d_vertex";
31 pool
= idws
->pools
.gem
;
33 } else if (type
== I915_NEW_SCANOUT
) {
34 name
= "gallium3d_scanout";
35 pool
= idws
->pools
.gem
;
39 name
= "gallium3d_unknown";
40 pool
= idws
->pools
.gem
;
43 buf
->bo
= drm_intel_bo_alloc(pool
, name
, size
, alignment
);
48 return (struct i915_winsys_buffer
*)buf
;
56 static struct i915_winsys_buffer
*
57 i915_drm_buffer_from_handle(struct i915_winsys
*iws
,
58 struct winsys_handle
*whandle
,
61 struct i915_drm_winsys
*idws
= i915_drm_winsys(iws
);
62 struct i915_drm_buffer
*buf
= CALLOC_STRUCT(i915_drm_buffer
);
63 uint32_t tile
= 0, swizzle
= 0;
68 buf
->magic
= 0xDEAD1337;
69 buf
->bo
= drm_intel_bo_gem_create_from_name(idws
->pools
.gem
, "gallium3d_from_handle", whandle
->handle
);
71 buf
->flink
= whandle
->handle
;
76 drm_intel_bo_get_tiling(buf
->bo
, &tile
, &swizzle
);
77 if (tile
!= I915_TILE_NONE
)
80 *stride
= whandle
->stride
;
82 return (struct i915_winsys_buffer
*)buf
;
90 i915_drm_buffer_get_handle(struct i915_winsys
*iws
,
91 struct i915_winsys_buffer
*buffer
,
92 struct winsys_handle
*whandle
,
95 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
97 if (whandle
->type
== DRM_API_HANDLE_TYPE_SHARED
) {
99 if (drm_intel_bo_flink(buf
->bo
, &buf
->flink
))
104 whandle
->handle
= buf
->flink
;
105 } else if (whandle
->type
== DRM_API_HANDLE_TYPE_KMS
) {
106 whandle
->handle
= buf
->bo
->handle
;
108 assert(!"unknown usage");
112 whandle
->stride
= stride
;
117 i915_drm_buffer_set_fence_reg(struct i915_winsys
*iws
,
118 struct i915_winsys_buffer
*buffer
,
120 enum i915_winsys_buffer_tile tile
)
122 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
123 assert(I915_TILING_NONE
== I915_TILE_NONE
);
124 assert(I915_TILING_X
== I915_TILE_X
);
125 assert(I915_TILING_Y
== I915_TILE_Y
);
127 if (tile
!= I915_TILE_NONE
) {
128 assert(buf
->map_count
== 0);
132 return drm_intel_bo_set_tiling(buf
->bo
, &tile
, stride
);
136 i915_drm_buffer_map(struct i915_winsys
*iws
,
137 struct i915_winsys_buffer
*buffer
,
140 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
141 drm_intel_bo
*bo
= intel_bo(buffer
);
150 ret
= drm_intel_gem_bo_map_gtt(bo
);
152 ret
= drm_intel_bo_map(bo
, write
);
154 buf
->ptr
= bo
->virtual;
166 i915_drm_buffer_unmap(struct i915_winsys
*iws
,
167 struct i915_winsys_buffer
*buffer
)
169 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
171 if (--buf
->map_count
)
175 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer
));
177 drm_intel_bo_unmap(intel_bo(buffer
));
181 i915_drm_buffer_write(struct i915_winsys
*iws
,
182 struct i915_winsys_buffer
*buffer
,
187 struct i915_drm_buffer
*buf
= i915_drm_buffer(buffer
);
189 return drm_intel_bo_subdata(buf
->bo
, offset
, size
, (void*)data
);
193 i915_drm_buffer_destroy(struct i915_winsys
*iws
,
194 struct i915_winsys_buffer
*buffer
)
196 drm_intel_bo_unreference(intel_bo(buffer
));
199 i915_drm_buffer(buffer
)->magic
= 0;
200 i915_drm_buffer(buffer
)->bo
= NULL
;
207 i915_drm_winsys_init_buffer_functions(struct i915_drm_winsys
*idws
)
209 idws
->base
.buffer_create
= i915_drm_buffer_create
;
210 idws
->base
.buffer_from_handle
= i915_drm_buffer_from_handle
;
211 idws
->base
.buffer_get_handle
= i915_drm_buffer_get_handle
;
212 idws
->base
.buffer_set_fence_reg
= i915_drm_buffer_set_fence_reg
;
213 idws
->base
.buffer_map
= i915_drm_buffer_map
;
214 idws
->base
.buffer_unmap
= i915_drm_buffer_unmap
;
215 idws
->base
.buffer_write
= i915_drm_buffer_write
;
216 idws
->base
.buffer_destroy
= i915_drm_buffer_destroy
;