3 #include "state_tracker/drm_api.h"
5 #include "i965_drm_winsys.h"
6 #include "util/u_memory.h"
8 #include "i965/brw_context.h" /* XXX: shouldn't be doing this */
9 #include "i965/brw_screen.h" /* XXX: shouldn't be doing this */
11 #include "trace/tr_drm.h"
19 i965_libdrm_get_device_id(unsigned int *device_id
)
26 * FIXME: Fix this up to use a drm ioctl or whatever.
29 snprintf(path
, sizeof(path
), "/sys/class/drm/card0/device/device");
30 file
= fopen(path
, "r");
35 shutup_gcc
= fgets(path
, sizeof(path
), file
);
36 sscanf(path
, "%x", device_id
);
40 static struct i965_libdrm_buffer
*
41 i965_libdrm_buffer_from_handle(struct i965_libdrm_winsys
*idws
,
42 const char* name
, unsigned handle
)
44 struct i965_libdrm_buffer
*buf
= CALLOC_STRUCT(i965_libdrm_buffer
);
45 uint32_t tile
= 0, swizzle
= 0;
48 debug_printf("%s\n", __FUNCTION__
);
52 pipe_reference_init(&buf
->base
.reference
, 1);
53 buf
->bo
= drm_intel_bo_gem_create_from_name(idws
->gem
, name
, handle
);
54 buf
->base
.size
= buf
->bo
->size
;
55 buf
->base
.sws
= &idws
->base
;
63 drm_intel_bo_get_tiling(buf
->bo
, &tile
, &swizzle
);
80 static struct pipe_texture
*
81 i965_libdrm_texture_from_shared_handle(struct drm_api
*api
,
82 struct pipe_screen
*screen
,
83 struct pipe_texture
*template,
88 /* XXX: this is silly -- there should be a way to get directly from
89 * the "drm_api" struct to ourselves, without peering into
92 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(brw_screen(screen
)->sws
);
93 struct i965_libdrm_buffer
*buffer
;
96 debug_printf("%s %s pitch %d handle 0x%x\n", __FUNCTION__
,
99 buffer
= i965_libdrm_buffer_from_handle(idws
, name
, handle
);
103 return brw_texture_blanket_winsys_buffer(screen
, template, pitch
, &buffer
->base
);
108 i965_libdrm_shared_handle_from_texture(struct drm_api
*api
,
109 struct pipe_screen
*screen
,
110 struct pipe_texture
*texture
,
114 struct i965_libdrm_buffer
*buf
= NULL
;
115 struct brw_winsys_buffer
*buffer
= NULL
;
118 debug_printf("%s\n", __FUNCTION__
);
120 if (!brw_texture_get_winsys_buffer(texture
, &buffer
, pitch
))
123 buf
= i965_libdrm_buffer(buffer
);
125 if (drm_intel_bo_flink(buf
->bo
, &buf
->flink
))
130 *handle
= buf
->flink
;
133 debug_printf(" -> pitch %d handle 0x%x\n", *pitch
, *handle
);
139 i965_libdrm_local_handle_from_texture(struct drm_api
*api
,
140 struct pipe_screen
*screen
,
141 struct pipe_texture
*texture
,
145 struct brw_winsys_buffer
*buffer
= NULL
;
148 debug_printf("%s\n", __FUNCTION__
);
150 if (!brw_texture_get_winsys_buffer(texture
, &buffer
, pitch
))
153 *handle
= i965_libdrm_buffer(buffer
)->bo
->handle
;
156 debug_printf(" -> pitch %d handle 0x%x\n", *pitch
, *handle
);
162 i965_libdrm_winsys_destroy(struct brw_winsys_screen
*iws
)
164 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(iws
);
167 debug_printf("%s\n", __FUNCTION__
);
169 drm_intel_bufmgr_destroy(idws
->gem
);
174 static struct pipe_screen
*
175 i965_libdrm_create_screen(struct drm_api
*api
, int drmFD
,
176 struct drm_create_screen_arg
*arg
)
178 struct i965_libdrm_winsys
*idws
;
179 unsigned int deviceID
;
181 debug_printf("%s\n", __FUNCTION__
);
185 case DRM_CREATE_NORMAL
:
192 idws
= CALLOC_STRUCT(i965_libdrm_winsys
);
196 i965_libdrm_get_device_id(&deviceID
);
198 i965_libdrm_winsys_init_buffer_functions(idws
);
203 idws
->base
.destroy
= i965_libdrm_winsys_destroy
;
205 idws
->gem
= drm_intel_bufmgr_gem_init(idws
->fd
, BRW_BATCH_SIZE
);
206 drm_intel_bufmgr_gem_enable_reuse(idws
->gem
);
208 idws
->send_cmd
= !debug_get_bool_option("BRW_NO_HW", FALSE
);
210 return brw_create_screen(&idws
->base
, deviceID
);
213 static struct pipe_context
*
214 i965_libdrm_create_context(struct drm_api
*api
, struct pipe_screen
*screen
)
216 return brw_create_context(screen
);
220 destroy(struct drm_api
*api
)
223 debug_printf("%s\n", __FUNCTION__
);
227 struct drm_api i965_libdrm_api
=
229 .create_context
= i965_libdrm_create_context
,
230 .create_screen
= i965_libdrm_create_screen
,
231 .texture_from_shared_handle
= i965_libdrm_texture_from_shared_handle
,
232 .shared_handle_from_texture
= i965_libdrm_shared_handle_from_texture
,
233 .local_handle_from_texture
= i965_libdrm_local_handle_from_texture
,
240 return trace_drm_create(&i965_libdrm_api
);