2 #include "i965_drm_winsys.h"
3 #include "util/u_memory.h"
6 #include "intel_bufmgr.h"
10 const char *names
[BRW_BUFFER_TYPE_MAX
] = {
25 const char *usages
[BRW_USAGE_MAX
] = {
38 const char *data_types
[BRW_DATA_MAX
] =
43 "GS: SAMPLER_DEFAULT_COLOR",
63 static enum pipe_error
64 i965_libdrm_bo_alloc(struct brw_winsys_screen
*sws
,
65 enum brw_buffer_type type
,
68 struct brw_winsys_buffer
**bo_out
)
70 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(sws
);
71 struct i965_libdrm_buffer
*buf
;
74 debug_printf("%s type %s sz %d align %d\n",
75 __FUNCTION__
, names
[type
], size
, alignment
);
77 buf
= CALLOC_STRUCT(i965_libdrm_buffer
);
79 return PIPE_ERROR_OUT_OF_MEMORY
;
82 case BRW_BUFFER_TYPE_TEXTURE
:
83 /* case BRW_BUFFER_TYPE_SCANOUT:*/
84 case BRW_BUFFER_TYPE_VERTEX
:
85 case BRW_BUFFER_TYPE_CURBE
:
86 case BRW_BUFFER_TYPE_QUERY
:
87 case BRW_BUFFER_TYPE_SHADER_CONSTANTS
:
88 case BRW_BUFFER_TYPE_SHADER_SCRATCH
:
89 case BRW_BUFFER_TYPE_BATCH
:
90 case BRW_BUFFER_TYPE_GENERAL_STATE
:
91 case BRW_BUFFER_TYPE_SURFACE_STATE
:
92 case BRW_BUFFER_TYPE_PIXEL
:
93 case BRW_BUFFER_TYPE_GENERIC
:
95 case BRW_BUFFER_TYPE_SCANOUT
:
103 buf
->bo
= drm_intel_bo_alloc(idws
->gem
,
111 pipe_reference_init(&buf
->base
.reference
, 1);
112 buf
->base
.size
= size
;
115 *bo_out
= &buf
->base
;
121 return PIPE_ERROR_OUT_OF_MEMORY
;
125 i965_libdrm_bo_destroy(struct brw_winsys_buffer
*buffer
)
127 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
130 debug_printf("%s\n", __FUNCTION__
);
132 drm_intel_bo_unreference(buf
->bo
);
136 static enum pipe_error
137 i965_libdrm_bo_emit_reloc(struct brw_winsys_buffer
*buffer
,
138 enum brw_buffer_usage usage
,
141 struct brw_winsys_buffer
*buffer2
)
143 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
144 struct i965_libdrm_buffer
*buf2
= i965_libdrm_buffer(buffer2
);
149 debug_printf("%s buf %p offset %x delta %x buf2 %p/%s/%s\n",
150 __FUNCTION__
, (void *)buffer
,
152 (void *)buffer2
, names
[buf2
->data_type
], usages
[usage
]);
155 case BRW_USAGE_STATE
:
156 read
= I915_GEM_DOMAIN_INSTRUCTION
;
159 case BRW_USAGE_QUERY_RESULT
:
160 read
= I915_GEM_DOMAIN_INSTRUCTION
;
161 write
= I915_GEM_DOMAIN_INSTRUCTION
;
163 case BRW_USAGE_RENDER_TARGET
:
164 read
= I915_GEM_DOMAIN_RENDER
;
167 case BRW_USAGE_DEPTH_BUFFER
:
168 read
= I915_GEM_DOMAIN_RENDER
;
169 write
= I915_GEM_DOMAIN_RENDER
;
171 case BRW_USAGE_BLIT_SOURCE
:
173 write
= I915_GEM_DOMAIN_RENDER
;
175 case BRW_USAGE_BLIT_DEST
:
176 read
= I915_GEM_DOMAIN_RENDER
;
177 write
= I915_GEM_DOMAIN_RENDER
;
179 case BRW_USAGE_SAMPLER
:
180 read
= I915_GEM_DOMAIN_SAMPLER
;
183 case BRW_USAGE_VERTEX
:
184 read
= I915_GEM_DOMAIN_VERTEX
;
187 case BRW_USAGE_SCRATCH
:
197 ((uint32_t *)buf->bo->virtual)[offset/4] = (delta +
201 ret
= dri_bo_emit_reloc( buf
->bo
, read
, write
, delta
, offset
, buf2
->bo
);
208 static enum pipe_error
209 i965_libdrm_bo_exec(struct brw_winsys_buffer
*buffer
,
212 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
213 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(buffer
->sws
);
217 debug_printf("execute buffer %p, bytes %d\n", (void *)buffer
, bytes_used
);
219 if (idws
->send_cmd
) {
220 ret
= dri_bo_exec(buf
->bo
, bytes_used
, NULL
, 0, 0);
228 static enum pipe_error
229 i965_libdrm_bo_subdata(struct brw_winsys_buffer
*buffer
,
230 enum brw_buffer_data_type data_type
,
234 const struct brw_winsys_reloc
*reloc
,
237 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
238 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(buffer
->sws
);
244 debug_printf("%s buf %p off %d sz %d %s relocs: %d\n",
246 (void *)buffer
, offset
, size
,
247 data_types
[data_type
],
251 brw_dump_data( idws
->id
,
253 buf
->bo
->offset
+ offset
,
256 /* XXX: use bo_map_gtt/memcpy/unmap_gtt under some circumstances???
258 ret
= drm_intel_bo_subdata(buf
->bo
, offset
, size
, (void*)data
);
262 for (i
= 0; i
< nr_reloc
; i
++) {
263 i965_libdrm_bo_emit_reloc(buffer
, reloc
[i
].usage
, reloc
[i
].delta
,
264 reloc
[i
].offset
, reloc
[i
].bo
);
271 i965_libdrm_bo_is_busy(struct brw_winsys_buffer
*buffer
)
273 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
277 debug_printf("%s %p\n", __FUNCTION__
, (void *)buffer
);
279 ret
= drm_intel_bo_busy(buf
->bo
);
282 debug_printf(" --> %d\n", ret
);
288 i965_libdrm_bo_references(struct brw_winsys_buffer
*a
,
289 struct brw_winsys_buffer
*b
)
291 struct i965_libdrm_buffer
*bufa
= i965_libdrm_buffer(a
);
292 struct i965_libdrm_buffer
*bufb
= i965_libdrm_buffer(b
);
296 debug_printf("%s %p %p\n", __FUNCTION__
, (void *)a
, (void *)b
);
298 ret
= drm_intel_bo_references(bufa
->bo
, bufb
->bo
);
301 debug_printf(" --> %d\n", ret
);
306 /* XXX: couldn't this be handled by returning true/false on
309 static enum pipe_error
310 i965_libdrm_check_aperture_space(struct brw_winsys_screen
*iws
,
311 struct brw_winsys_buffer
**buffers
,
314 static drm_intel_bo
*bos
[128];
319 debug_printf("%s\n", __FUNCTION__
);
321 if (count
> Elements(bos
)) {
326 for (i
= 0; i
< count
; i
++)
327 bos
[i
] = i965_libdrm_buffer(buffers
[i
])->bo
;
329 /* XXX: converting from ??? to pipe_error:
331 ret
= dri_bufmgr_check_aperture_space(bos
, count
);
334 debug_printf(" --> %d (ok == %d)\n", ret
, PIPE_OK
);
340 i965_libdrm_bo_map(struct brw_winsys_buffer
*buffer
,
341 enum brw_buffer_data_type data_type
,
346 boolean flush_explicit
)
348 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
353 debug_printf("%s %p %s %s\n", __FUNCTION__
, (void *)buffer
,
354 write
? "read/write" : "read",
355 write
? data_types
[data_type
] : "");
357 if (!buf
->map_count
) {
359 ret
= drm_intel_gem_bo_map_gtt(buf
->bo
);
364 ret
= drm_intel_bo_map(buf
->bo
, write
);
370 buf
->data_type
= data_type
;
372 return buf
->bo
->virtual;
376 i965_libdrm_bo_flush_range(struct brw_winsys_buffer
*buffer
,
380 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
381 struct i965_libdrm_winsys
*idws
= i965_libdrm_winsys(buffer
->sws
);
384 debug_printf("%s %s offset %d len %d\n", __FUNCTION__
,
385 data_types
[buf
->data_type
],
389 brw_dump_data( idws
->id
,
391 buf
->bo
->offset
+ offset
,
392 buf
->bo
->virtual + offset
,
397 i965_libdrm_bo_unmap(struct brw_winsys_buffer
*buffer
)
399 struct i965_libdrm_buffer
*buf
= i965_libdrm_buffer(buffer
);
402 debug_printf("%s\n", __FUNCTION__
);
404 if (--buf
->map_count
> 0)
408 drm_intel_gem_bo_unmap_gtt(buf
->bo
);
410 drm_intel_bo_unmap(buf
->bo
);
414 i965_libdrm_winsys_init_buffer_functions(struct i965_libdrm_winsys
*idws
)
416 idws
->base
.bo_alloc
= i965_libdrm_bo_alloc
;
417 idws
->base
.bo_destroy
= i965_libdrm_bo_destroy
;
418 idws
->base
.bo_emit_reloc
= i965_libdrm_bo_emit_reloc
;
419 idws
->base
.bo_exec
= i965_libdrm_bo_exec
;
420 idws
->base
.bo_subdata
= i965_libdrm_bo_subdata
;
421 idws
->base
.bo_is_busy
= i965_libdrm_bo_is_busy
;
422 idws
->base
.bo_references
= i965_libdrm_bo_references
;
423 idws
->base
.check_aperture_space
= i965_libdrm_check_aperture_space
;
424 idws
->base
.bo_map
= i965_libdrm_bo_map
;
425 idws
->base
.bo_flush_range
= i965_libdrm_bo_flush_range
;
426 idws
->base
.bo_unmap
= i965_libdrm_bo_unmap
;