svga: Condition preemptive flush on draw emission
On ultra high resolution modes, the preemptive flush flag can be set midway through command submission, a condition that cannot be recovered from a flush-retry, causing rendering artifacts. This patch prevents a preemtive_flush until a draw has been emitted. Signed-off-by: Sinclair Yeh <syeh@vmware.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Charmaine Lee <charmainel@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -1016,6 +1016,8 @@ SVGA3D_BeginDrawPrimitives(struct svga_winsys_context *swc,
|
||||
*decls = declArray;
|
||||
*ranges = rangeArray;
|
||||
|
||||
swc->hints |= SVGA_HINT_FLAG_DRAW_EMITTED;
|
||||
|
||||
return PIPE_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -535,6 +535,7 @@ SVGA3D_vgpu10_Draw(struct svga_winsys_context *swc,
|
||||
|
||||
SVGA3D_COPY_BASIC_2(vertexCount, startVertexLocation);
|
||||
|
||||
swc->hints |= SVGA_HINT_FLAG_DRAW_EMITTED;
|
||||
swc->commit(swc);
|
||||
return PIPE_OK;
|
||||
}
|
||||
@@ -550,6 +551,7 @@ SVGA3D_vgpu10_DrawIndexed(struct svga_winsys_context *swc,
|
||||
SVGA3D_COPY_BASIC_3(indexCount, startIndexLocation,
|
||||
baseVertexLocation);
|
||||
|
||||
swc->hints |= SVGA_HINT_FLAG_DRAW_EMITTED;
|
||||
swc->commit(swc);
|
||||
return PIPE_OK;
|
||||
}
|
||||
@@ -566,6 +568,7 @@ SVGA3D_vgpu10_DrawInstanced(struct svga_winsys_context *swc,
|
||||
SVGA3D_COPY_BASIC_4(vertexCountPerInstance, instanceCount,
|
||||
startVertexLocation, startInstanceLocation);
|
||||
|
||||
swc->hints |= SVGA_HINT_FLAG_DRAW_EMITTED;
|
||||
swc->commit(swc);
|
||||
return PIPE_OK;
|
||||
}
|
||||
@@ -584,6 +587,8 @@ SVGA3D_vgpu10_DrawIndexedInstanced(struct svga_winsys_context *swc,
|
||||
startIndexLocation, baseVertexLocation,
|
||||
startInstanceLocation);
|
||||
|
||||
|
||||
swc->hints |= SVGA_HINT_FLAG_DRAW_EMITTED;
|
||||
swc->commit(swc);
|
||||
return PIPE_OK;
|
||||
}
|
||||
@@ -593,6 +598,7 @@ SVGA3D_vgpu10_DrawAuto(struct svga_winsys_context *swc)
|
||||
{
|
||||
SVGA3D_CREATE_COMMAND(DrawAuto, DRAW_AUTO);
|
||||
|
||||
swc->hints |= SVGA_HINT_FLAG_DRAW_EMITTED;
|
||||
swc->commit(swc);
|
||||
return PIPE_OK;
|
||||
}
|
||||
|
||||
@@ -85,6 +85,8 @@ struct winsys_handle;
|
||||
#define SVGA_QUERY_FLAG_SET (1 << 0)
|
||||
#define SVGA_QUERY_FLAG_REF (1 << 1)
|
||||
|
||||
#define SVGA_HINT_FLAG_DRAW_EMITTED (1 << 0)
|
||||
|
||||
/** Opaque surface handle */
|
||||
struct svga_winsys_surface;
|
||||
|
||||
@@ -212,6 +214,11 @@ struct svga_winsys_context
|
||||
*/
|
||||
uint32 cid;
|
||||
|
||||
/**
|
||||
* Flags to hint the current context state
|
||||
*/
|
||||
uint32 hints;
|
||||
|
||||
/**
|
||||
** BEGIN new functions for guest-backed surfaces.
|
||||
**/
|
||||
|
||||
@@ -251,6 +251,7 @@ vmw_swc_flush(struct svga_winsys_context *swc,
|
||||
vswc->must_flush = FALSE;
|
||||
debug_flush_flush(vswc->fctx);
|
||||
#endif
|
||||
swc->hints &= ~SVGA_HINT_FLAG_DRAW_EMITTED;
|
||||
vswc->preemptive_flush = FALSE;
|
||||
vswc->seen_surfaces = 0;
|
||||
vswc->seen_regions = 0;
|
||||
@@ -372,7 +373,8 @@ vmw_swc_region_relocation(struct svga_winsys_context *swc,
|
||||
|
||||
if (vmw_swc_add_validate_buffer(vswc, reloc->buffer, flags)) {
|
||||
vswc->seen_regions += reloc->buffer->size;
|
||||
if(vswc->seen_regions >= VMW_GMR_POOL_SIZE/5)
|
||||
if ((swc->hints & SVGA_HINT_FLAG_DRAW_EMITTED) &&
|
||||
vswc->seen_regions >= VMW_GMR_POOL_SIZE/5)
|
||||
vswc->preemptive_flush = TRUE;
|
||||
}
|
||||
|
||||
@@ -413,8 +415,10 @@ vmw_swc_mob_relocation(struct svga_winsys_context *swc,
|
||||
|
||||
if (vmw_swc_add_validate_buffer(vswc, pb_buffer, flags)) {
|
||||
vswc->seen_mobs += pb_buffer->size;
|
||||
/* divide by 5, tested for best performance */
|
||||
if (vswc->seen_mobs >= vswc->vws->ioctl.max_mob_memory / VMW_MAX_MOB_MEM_FACTOR)
|
||||
|
||||
if ((swc->hints & SVGA_HINT_FLAG_DRAW_EMITTED) &&
|
||||
vswc->seen_mobs >=
|
||||
vswc->vws->ioctl.max_mob_memory / VMW_MAX_MOB_MEM_FACTOR)
|
||||
vswc->preemptive_flush = TRUE;
|
||||
}
|
||||
|
||||
@@ -475,8 +479,9 @@ vmw_swc_surface_only_relocation(struct svga_winsys_context *swc,
|
||||
++vswc->surface.staged;
|
||||
|
||||
vswc->seen_surfaces += vsurf->size;
|
||||
/* divide by 5 not well tuned for performance */
|
||||
if (vswc->seen_surfaces >= vswc->vws->ioctl.max_surface_memory / VMW_MAX_SURF_MEM_FACTOR)
|
||||
if ((swc->hints & SVGA_HINT_FLAG_DRAW_EMITTED) &&
|
||||
vswc->seen_surfaces >=
|
||||
vswc->vws->ioctl.max_surface_memory / VMW_MAX_SURF_MEM_FACTOR)
|
||||
vswc->preemptive_flush = TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user