2 #include "i965_drm_winsys.h"
3 #include "util/u_memory.h"
4 #include "util/u_inlines.h"
7 #include "intel_bufmgr.h"
11 const char *names
[BRW_BUFFER_TYPE_MAX
] = {
26 const char *usages
[BRW_USAGE_MAX
] = {
39 const char *data_types
[BRW_DATA_MAX
] =
44 "GS: SAMPLER_DEFAULT_COLOR",
64 static enum pipe_error
65 i965_libdrm_bo_alloc(struct brw_winsys_screen
*sws
,
66 enum brw_buffer_type type
,
69 struct brw_winsys_buffer
**bo_out
)
71 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(sws
);
72 struct i965_libdrm_buffer
*buf
;
75 debug_printf("%s type %s sz %d align %d\n",
76 __FUNCTION__
, names
[type
], size
, alignment
);
78 buf
= CALLOC_STRUCT(i965_libdrm_buffer
);
80 return PIPE_ERROR_OUT_OF_MEMORY
;
83 case BRW_BUFFER_TYPE_TEXTURE
:
84 /* case BRW_BUFFER_TYPE_SCANOUT:*/
85 case BRW_BUFFER_TYPE_VERTEX
:
86 case BRW_BUFFER_TYPE_CURBE
:
87 case BRW_BUFFER_TYPE_QUERY
:
88 case BRW_BUFFER_TYPE_SHADER_CONSTANTS
:
89 case BRW_BUFFER_TYPE_SHADER_SCRATCH
:
90 case BRW_BUFFER_TYPE_BATCH
:
91 case BRW_BUFFER_TYPE_GENERAL_STATE
:
92 case BRW_BUFFER_TYPE_SURFACE_STATE
:
93 case BRW_BUFFER_TYPE_PIXEL
:
94 case BRW_BUFFER_TYPE_GENERIC
:
96 case BRW_BUFFER_TYPE_SCANOUT
:
104 buf
->bo
= drm_intel_bo_alloc(idws
->gem
,
112 pipe_reference_init(&buf
->base
.reference
, 1);
113 buf
->base
.size
= size
;
116 *bo_out
= &buf
->base
;
122 return PIPE_ERROR_OUT_OF_MEMORY
;
126 i965_libdrm_bo_destroy(struct brw_winsys_buffer
*buffer
)
128 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
131 debug_printf("%s\n", __FUNCTION__
);
133 drm_intel_bo_unreference(buf
->bo
);
137 static enum pipe_error
138 i965_libdrm_bo_emit_reloc(struct brw_winsys_buffer
*buffer
,
139 enum brw_buffer_usage usage
,
142 struct brw_winsys_buffer
*buffer2
)
144 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
145 struct i965_libdrm_buffer
*buf2
= i965_libdrm_buffer(buffer2
);
150 debug_printf("%s buf %p offset %x delta %x buf2 %p/%s/%s\n",
151 __FUNCTION__
, (void *)buffer
,
153 (void *)buffer2
, names
[buf2
->data_type
], usages
[usage
]);
156 case BRW_USAGE_STATE
:
157 read
= I915_GEM_DOMAIN_INSTRUCTION
;
160 case BRW_USAGE_QUERY_RESULT
:
161 read
= I915_GEM_DOMAIN_INSTRUCTION
;
162 write
= I915_GEM_DOMAIN_INSTRUCTION
;
164 case BRW_USAGE_RENDER_TARGET
:
165 read
= I915_GEM_DOMAIN_RENDER
;
168 case BRW_USAGE_DEPTH_BUFFER
:
169 read
= I915_GEM_DOMAIN_RENDER
;
170 write
= I915_GEM_DOMAIN_RENDER
;
172 case BRW_USAGE_BLIT_SOURCE
:
174 write
= I915_GEM_DOMAIN_RENDER
;
176 case BRW_USAGE_BLIT_DEST
:
177 read
= I915_GEM_DOMAIN_RENDER
;
178 write
= I915_GEM_DOMAIN_RENDER
;
180 case BRW_USAGE_SAMPLER
:
181 read
= I915_GEM_DOMAIN_SAMPLER
;
184 case BRW_USAGE_VERTEX
:
185 read
= I915_GEM_DOMAIN_VERTEX
;
188 case BRW_USAGE_SCRATCH
:
198 ((uint32_t *)buf->bo->virtual)[offset/4] = (delta +
202 ret
= dri_bo_emit_reloc( buf
->bo
, read
, write
, delta
, offset
, buf2
->bo
);
209 static enum pipe_error
210 i965_libdrm_bo_exec(struct brw_winsys_buffer
*buffer
,
213 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
214 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(buffer
->sws
);
218 debug_printf("execute buffer %p, bytes %d\n", (void *)buffer
, bytes_used
);
220 if (idws
->send_cmd
) {
221 ret
= dri_bo_exec(buf
->bo
, bytes_used
, NULL
, 0, 0);
229 static enum pipe_error
230 i965_libdrm_bo_subdata(struct brw_winsys_buffer
*buffer
,
231 enum brw_buffer_data_type data_type
,
235 const struct brw_winsys_reloc
*reloc
,
238 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
239 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(buffer
->sws
);
245 debug_printf("%s buf %p off %d sz %d %s relocs: %d\n",
247 (void *)buffer
, offset
, size
,
248 data_types
[data_type
],
252 brw_dump_data( idws
->id
,
254 buf
->bo
->offset
+ offset
,
257 /* XXX: use bo_map_gtt/memcpy/unmap_gtt under some circumstances???
259 ret
= drm_intel_bo_subdata(buf
->bo
, offset
, size
, (void*)data
);
263 for (i
= 0; i
< nr_reloc
; i
++) {
264 i965_libdrm_bo_emit_reloc(buffer
, reloc
[i
].usage
, reloc
[i
].delta
,
265 reloc
[i
].offset
, reloc
[i
].bo
);
272 i965_libdrm_bo_is_busy(struct brw_winsys_buffer
*buffer
)
274 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
278 debug_printf("%s %p\n", __FUNCTION__
, (void *)buffer
);
280 ret
= drm_intel_bo_busy(buf
->bo
);
283 debug_printf(" --> %d\n", ret
);
289 i965_libdrm_bo_references(struct brw_winsys_buffer
*a
,
290 struct brw_winsys_buffer
*b
)
292 struct i965_libdrm_buffer
*bufa
= i965_libdrm_buffer(a
);
293 struct i965_libdrm_buffer
*bufb
= i965_libdrm_buffer(b
);
297 debug_printf("%s %p %p\n", __FUNCTION__
, (void *)a
, (void *)b
);
299 ret
= drm_intel_bo_references(bufa
->bo
, bufb
->bo
);
302 debug_printf(" --> %d\n", ret
);
307 /* XXX: couldn't this be handled by returning true/false on
310 static enum pipe_error
311 i965_libdrm_check_aperture_space(struct brw_winsys_screen
*iws
,
312 struct brw_winsys_buffer
**buffers
,
315 static drm_intel_bo
*bos
[128];
320 debug_printf("%s\n", __FUNCTION__
);
322 if (count
> Elements(bos
)) {
327 for (i
= 0; i
< count
; i
++)
328 bos
[i
] = i965_libdrm_buffer(buffers
[i
])->bo
;
330 /* XXX: converting from ??? to pipe_error:
332 ret
= dri_bufmgr_check_aperture_space(bos
, count
);
335 debug_printf(" --> %d (ok == %d)\n", ret
, PIPE_OK
);
341 i965_libdrm_bo_map(struct brw_winsys_buffer
*buffer
,
342 enum brw_buffer_data_type data_type
,
347 boolean flush_explicit
)
349 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
354 debug_printf("%s %p %s %s\n", __FUNCTION__
, (void *)buffer
,
355 write
? "read/write" : "read",
356 write
? data_types
[data_type
] : "");
358 if (!buf
->map_count
) {
360 ret
= drm_intel_gem_bo_map_gtt(buf
->bo
);
365 ret
= drm_intel_bo_map(buf
->bo
, write
);
371 buf
->data_type
= data_type
;
373 return buf
->bo
->virtual;
377 i965_libdrm_bo_flush_range(struct brw_winsys_buffer
*buffer
,
381 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
382 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(buffer
->sws
);
385 debug_printf("%s %s offset %d len %d\n", __FUNCTION__
,
386 data_types
[buf
->data_type
],
390 brw_dump_data( idws
->id
,
392 buf
->bo
->offset
+ offset
,
393 buf
->bo
->virtual + offset
,
398 i965_libdrm_bo_unmap(struct brw_winsys_buffer
*buffer
)
400 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
403 debug_printf("%s\n", __FUNCTION__
);
405 if (--buf
->map_count
> 0)
409 drm_intel_gem_bo_unmap_gtt(buf
->bo
);
411 drm_intel_bo_unmap(buf
->bo
);
415 i965_libdrm_winsys_init_buffer_functions(struct i965_libdrm_winsys
*idws
)
417 idws
->base
.bo_alloc
= i965_libdrm_bo_alloc
;
418 idws
->base
.bo_destroy
= i965_libdrm_bo_destroy
;
419 idws
->base
.bo_emit_reloc
= i965_libdrm_bo_emit_reloc
;
420 idws
->base
.bo_exec
= i965_libdrm_bo_exec
;
421 idws
->base
.bo_subdata
= i965_libdrm_bo_subdata
;
422 idws
->base
.bo_is_busy
= i965_libdrm_bo_is_busy
;
423 idws
->base
.bo_references
= i965_libdrm_bo_references
;
424 idws
->base
.check_aperture_space
= i965_libdrm_check_aperture_space
;
425 idws
->base
.bo_map
= i965_libdrm_bo_map
;
426 idws
->base
.bo_flush_range
= i965_libdrm_bo_flush_range
;
427 idws
->base
.bo_unmap
= i965_libdrm_bo_unmap
;