3 #include "state_tracker/drm_api.h"
5 #include "intel_drm_winsys.h"
6 #include "util/u_memory.h"
8 #include "i915/i915_context.h"
9 #include "i915/i915_screen.h"
11 #include "trace/tr_drm.h"
19 intel_drm_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
);
37 sscanf(path
, "%x", device_id
);
41 static struct intel_buffer
*
42 intel_drm_buffer_from_handle(struct intel_drm_winsys
*idws
,
43 const char* name
, unsigned handle
)
45 struct intel_drm_buffer
*buf
= CALLOC_STRUCT(intel_drm_buffer
);
46 uint32_t tile
= 0, swizzle
= 0;
51 buf
->magic
= 0xDEAD1337;
52 buf
->bo
= drm_intel_bo_gem_create_from_name(idws
->pools
.gem
, name
, handle
);
59 drm_intel_bo_get_tiling(buf
->bo
, &tile
, &swizzle
);
60 if (tile
!= INTEL_TILE_NONE
)
63 return (struct intel_buffer
*)buf
;
76 static struct pipe_texture
*
77 intel_drm_texture_from_shared_handle(struct drm_api
*api
,
78 struct pipe_screen
*screen
,
79 struct pipe_texture
*templ
,
84 struct intel_drm_winsys
*idws
= intel_drm_winsys(i915_screen(screen
)->iws
);
85 struct intel_buffer
*buffer
;
87 buffer
= intel_drm_buffer_from_handle(idws
, name
, handle
);
91 return i915_texture_blanket_intel(screen
, templ
, pitch
, buffer
);
95 intel_drm_shared_handle_from_texture(struct drm_api
*api
,
96 struct pipe_screen
*screen
,
97 struct pipe_texture
*texture
,
101 struct intel_drm_buffer
*buf
= NULL
;
102 struct intel_buffer
*buffer
= NULL
;
103 if (!i915_get_texture_buffer_intel(texture
, &buffer
, pitch
))
106 buf
= intel_drm_buffer(buffer
);
108 if (drm_intel_bo_flink(buf
->bo
, &buf
->flink
))
113 *handle
= buf
->flink
;
119 intel_drm_local_handle_from_texture(struct drm_api
*api
,
120 struct pipe_screen
*screen
,
121 struct pipe_texture
*texture
,
125 struct intel_buffer
*buffer
= NULL
;
126 if (!i915_get_texture_buffer_intel(texture
, &buffer
, pitch
))
129 *handle
= intel_drm_buffer(buffer
)->bo
->handle
;
135 intel_drm_winsys_destroy(struct intel_winsys
*iws
)
137 struct intel_drm_winsys
*idws
= intel_drm_winsys(iws
);
139 drm_intel_bufmgr_destroy(idws
->pools
.gem
);
144 static struct pipe_screen
*
145 intel_drm_create_screen(struct drm_api
*api
, int drmFD
,
146 struct drm_create_screen_arg
*arg
)
148 struct intel_drm_winsys
*idws
;
149 unsigned int deviceID
;
153 case DRM_CREATE_NORMAL
:
160 idws
= CALLOC_STRUCT(intel_drm_winsys
);
164 intel_drm_get_device_id(&deviceID
);
166 intel_drm_winsys_init_batchbuffer_functions(idws
);
167 intel_drm_winsys_init_buffer_functions(idws
);
168 intel_drm_winsys_init_fence_functions(idws
);
172 idws
->max_batch_size
= 16 * 4096;
174 idws
->base
.destroy
= intel_drm_winsys_destroy
;
176 idws
->pools
.gem
= drm_intel_bufmgr_gem_init(idws
->fd
, idws
->max_batch_size
);
177 drm_intel_bufmgr_gem_enable_reuse(idws
->pools
.gem
);
179 idws
->dump_cmd
= debug_get_bool_option("INTEL_DUMP_CMD", FALSE
);
181 return i915_create_screen(&idws
->base
, deviceID
);
185 destroy(struct drm_api
*api
)
190 struct drm_api intel_drm_api
=
193 .driver_name
= "i915",
194 .create_screen
= intel_drm_create_screen
,
195 .texture_from_shared_handle
= intel_drm_texture_from_shared_handle
,
196 .shared_handle_from_texture
= intel_drm_shared_handle_from_texture
,
197 .local_handle_from_texture
= intel_drm_local_handle_from_texture
,
204 return trace_drm_create(&intel_drm_api
);