mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
r300g: do not tell st that a buffer is referenced by hw
It saves a few libdrm calls and unnecessary flushes.
This commit is contained in:
parent
bc8fa67926
commit
7a1b5c937f
7 changed files with 33 additions and 15 deletions
|
|
@ -152,9 +152,9 @@ static boolean immd_is_good_idea(struct r300_context *r300,
|
|||
if (!checked[vbi]) {
|
||||
vbuf = &r300->vertex_buffer[vbi];
|
||||
|
||||
if (r300->context.is_resource_referenced(&r300->context,
|
||||
vbuf->buffer,
|
||||
0, 0)) {
|
||||
if (r300->rws->is_buffer_referenced(r300->rws,
|
||||
r300_buffer(vbuf->buffer)->buf,
|
||||
R300_REF_CS | R300_REF_HW)) {
|
||||
/* It's a very bad idea to map it... */
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ static unsigned r300_buffer_is_referenced(struct pipe_context *context,
|
|||
if (r300_buffer_is_user_buffer(buf))
|
||||
return PIPE_UNREFERENCED;
|
||||
|
||||
if (r300->rws->is_buffer_referenced(r300->rws, rbuf->buf))
|
||||
if (r300->rws->is_buffer_referenced(r300->rws, rbuf->buf, R300_REF_CS))
|
||||
return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
|
||||
|
||||
return PIPE_UNREFERENCED;
|
||||
|
|
|
|||
|
|
@ -880,7 +880,7 @@ static unsigned r300_texture_is_referenced(struct pipe_context *context,
|
|||
struct r300_context *r300 = r300_context(context);
|
||||
struct r300_texture *rtex = (struct r300_texture *)texture;
|
||||
|
||||
if (r300->rws->is_buffer_referenced(r300->rws, rtex->buffer))
|
||||
if (r300->rws->is_buffer_referenced(r300->rws, rtex->buffer, R300_REF_CS))
|
||||
return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
|
||||
|
||||
return PIPE_UNREFERENCED;
|
||||
|
|
|
|||
|
|
@ -42,6 +42,11 @@ enum r300_value_id {
|
|||
R300_VID_TEX3D_MIP_BUG,
|
||||
};
|
||||
|
||||
enum r300_reference_domain { /* bitfield */
|
||||
R300_REF_CS = 1,
|
||||
R300_REF_HW = 2
|
||||
};
|
||||
|
||||
struct r300_winsys_screen {
|
||||
void (*destroy)(struct r300_winsys_screen *ws);
|
||||
|
||||
|
|
@ -160,9 +165,8 @@ struct r300_winsys_screen {
|
|||
struct winsys_handle *whandle);
|
||||
|
||||
boolean (*is_buffer_referenced)(struct r300_winsys_screen *winsys,
|
||||
struct r300_winsys_buffer *buffer);
|
||||
|
||||
|
||||
struct r300_winsys_buffer *buffer,
|
||||
enum r300_reference_domain domain);
|
||||
};
|
||||
|
||||
struct r300_winsys_screen *
|
||||
|
|
|
|||
|
|
@ -86,5 +86,6 @@ void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr);
|
|||
boolean radeon_drm_bufmgr_get_handle(struct pb_buffer *_buf,
|
||||
struct winsys_handle *whandle);
|
||||
|
||||
boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf);
|
||||
boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf,
|
||||
enum r300_reference_domain domain);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -381,13 +381,25 @@ void radeon_drm_bufmgr_write_reloc(struct pb_buffer *_buf,
|
|||
}
|
||||
}
|
||||
|
||||
boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf)
|
||||
boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf,
|
||||
enum r300_reference_domain domain)
|
||||
{
|
||||
struct radeon_drm_buffer *buf = get_drm_buffer(_buf);
|
||||
uint32_t domain;
|
||||
uint32_t tmp;
|
||||
|
||||
return (radeon_bo_is_referenced_by_cs(buf->bo, buf->mgr->rws->cs) ||
|
||||
radeon_bo_is_busy(buf->bo, &domain));
|
||||
if (domain & R300_REF_CS) {
|
||||
if (radeon_bo_is_referenced_by_cs(buf->bo, buf->mgr->rws->cs)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (domain & R300_REF_HW) {
|
||||
if (radeon_bo_is_busy(buf->bo, &tmp)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -111,11 +111,12 @@ static void radeon_r300_winsys_buffer_reference(struct r300_winsys_screen *rws,
|
|||
}
|
||||
|
||||
static boolean radeon_r300_winsys_is_buffer_referenced(struct r300_winsys_screen *rws,
|
||||
struct r300_winsys_buffer *buf)
|
||||
struct r300_winsys_buffer *buf,
|
||||
enum r300_reference_domain domain)
|
||||
{
|
||||
struct pb_buffer *_buf = radeon_pb_buffer(buf);
|
||||
|
||||
return radeon_drm_bufmgr_is_buffer_referenced(_buf);
|
||||
return radeon_drm_bufmgr_is_buffer_referenced(_buf, domain);
|
||||
}
|
||||
|
||||
static struct r300_winsys_buffer *radeon_r300_winsys_buffer_from_handle(struct r300_winsys_screen *rws,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue