Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com>tags/i965-primitive-restart-v2
| @@ -90,7 +90,7 @@ r300_texture_get_transfer(struct pipe_context *ctx, | |||
| boolean referenced_cs, referenced_hw; | |||
| referenced_cs = | |||
| r300->rws->cs_is_buffer_referenced(r300->cs, tex->cs_buf); | |||
| r300->rws->cs_is_buffer_referenced(r300->cs, tex->cs_buf, RADEON_USAGE_READWRITE); | |||
| if (referenced_cs) { | |||
| referenced_hw = TRUE; | |||
| } else { | |||
| @@ -346,7 +346,7 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query) | |||
| } | |||
| /* Obtain a new buffer if the current one can't be mapped without a stall. */ | |||
| if (rctx->ws->cs_is_buffer_referenced(rctx->cs, rquery->buffer.buf->cs_buf) || | |||
| if (rctx->ws->cs_is_buffer_referenced(rctx->cs, rquery->buffer.buf->cs_buf, RADEON_USAGE_READWRITE) || | |||
| rctx->ws->buffer_is_busy(rquery->buffer.buf->buf, RADEON_USAGE_READWRITE)) { | |||
| pipe_resource_reference((struct pipe_resource**)&rquery->buffer.buf, NULL); | |||
| rquery->buffer.buf = r600_new_query_buffer(rctx, rquery->type); | |||
| @@ -796,7 +796,7 @@ struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx, | |||
| /* Use a staging texture for uploads if the underlying BO is busy. */ | |||
| if (!(usage & PIPE_TRANSFER_READ) && | |||
| (rctx->ws->cs_is_buffer_referenced(rctx->cs, rtex->resource.cs_buf) || | |||
| (rctx->ws->cs_is_buffer_referenced(rctx->cs, rtex->resource.cs_buf, RADEON_USAGE_READWRITE) || | |||
| rctx->ws->buffer_is_busy(rtex->resource.buf, RADEON_USAGE_READWRITE))) | |||
| use_staging_texture = TRUE; | |||
| @@ -512,12 +512,26 @@ static void radeon_drm_cs_set_flush(struct radeon_winsys_cs *rcs, | |||
| } | |||
| static boolean radeon_bo_is_referenced(struct radeon_winsys_cs *rcs, | |||
| struct radeon_winsys_cs_handle *_buf) | |||
| struct radeon_winsys_cs_handle *_buf, | |||
| enum radeon_bo_usage usage) | |||
| { | |||
| struct radeon_drm_cs *cs = radeon_drm_cs(rcs); | |||
| struct radeon_bo *bo = (struct radeon_bo*)_buf; | |||
| int index; | |||
| return radeon_bo_is_referenced_by_cs(cs, bo); | |||
| if (!bo->num_cs_references) | |||
| return FALSE; | |||
| index = radeon_get_reloc(cs->csc, bo); | |||
| if (index == -1) | |||
| return FALSE; | |||
| if ((usage & RADEON_USAGE_WRITE) && cs->csc->relocs[index].write_domain) | |||
| return TRUE; | |||
| if ((usage & RADEON_USAGE_READ) && cs->csc->relocs[index].read_domains) | |||
| return TRUE; | |||
| return FALSE; | |||
| } | |||
| void radeon_drm_cs_init_functions(struct radeon_drm_winsys *ws) | |||
| @@ -341,7 +341,8 @@ struct radeon_winsys { | |||
| * \param buf A winsys buffer. | |||
| */ | |||
| boolean (*cs_is_buffer_referenced)(struct radeon_winsys_cs *cs, | |||
| struct radeon_winsys_cs_handle *buf); | |||
| struct radeon_winsys_cs_handle *buf, | |||
| enum radeon_bo_usage usage); | |||
| /** | |||
| * Request access to a feature for a command stream. | |||