mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
r300g: fix map_buffer
https://bugs.freedesktop.org/show_bug.cgi?id=30145
This commit is contained in:
parent
185434fbe8
commit
ae1aa14965
1 changed files with 17 additions and 4 deletions
|
|
@ -20,9 +20,6 @@ struct radeon_drm_buffer {
|
|||
|
||||
struct radeon_bo *bo;
|
||||
|
||||
/* The CS associated with the last buffer_map. */
|
||||
struct radeon_libdrm_cs *cs;
|
||||
|
||||
boolean flinked;
|
||||
uint32_t flink;
|
||||
|
||||
|
|
@ -95,9 +92,21 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
|
|||
struct radeon_libdrm_cs *cs = flush_ctx;
|
||||
int write = 0;
|
||||
|
||||
/* Note how we use radeon_bo_is_referenced_by_cs here. There are
|
||||
* basically two places this map function can be called from:
|
||||
* - pb_map
|
||||
* - create_buffer (in the buffer reuse case)
|
||||
*
|
||||
* Since pb managers are per-winsys managers, not per-context managers,
|
||||
* and we shouldn't reuse buffers if they are in-use in any context,
|
||||
* we simply ask: is this buffer referenced by *any* CS?
|
||||
*
|
||||
* The problem with buffer_create is that it comes from pipe_screen,
|
||||
* so we have no CS to look at, though luckily the following code
|
||||
* is sufficient to tell whether the buffer is in use. */
|
||||
if (flags & PB_USAGE_DONTBLOCK) {
|
||||
if (_buf->base.usage & RADEON_PB_USAGE_VERTEX)
|
||||
if (cs && radeon_bo_is_referenced_by_cs(buf->bo, cs->cs))
|
||||
if (radeon_bo_is_referenced_by_cs(buf->bo, NULL))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -110,6 +119,10 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* If we don't have any CS and the buffer is referenced,
|
||||
* we cannot flush. */
|
||||
assert(cs || !radeon_bo_is_referenced_by_cs(buf->bo, NULL));
|
||||
|
||||
if (cs && radeon_bo_is_referenced_by_cs(buf->bo, cs->cs)) {
|
||||
cs->flush_cs(cs->flush_data);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue