mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2025-12-24 13:40:13 +01:00
i915: Synchronize HWB and HWZ ring buffers before writing to them.
This commit is contained in:
parent
e43a68db2b
commit
974fe15f85
4 changed files with 15 additions and 12 deletions
|
|
@ -130,7 +130,7 @@ static void i915_emit_copy_blit(drm_device_t * dev,
|
|||
if (!dev_priv)
|
||||
return;
|
||||
|
||||
i915_kernel_lost_context(dev);
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->ring);
|
||||
while (pages > 0) {
|
||||
cur_pages = pages;
|
||||
if (cur_pages > 2048)
|
||||
|
|
|
|||
|
|
@ -68,11 +68,9 @@ int i915_wait_ring(drm_i915_private_t *dev_priv, drm_i915_ring_buffer_t *ring,
|
|||
return DRM_ERR(EBUSY);
|
||||
}
|
||||
|
||||
void i915_kernel_lost_context(drm_device_t * dev)
|
||||
void i915_kernel_lost_context(drm_i915_private_t * dev_priv,
|
||||
drm_i915_ring_buffer_t *ring)
|
||||
{
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
drm_i915_ring_buffer_t *ring = &(dev_priv->ring);
|
||||
|
||||
ring->head = I915_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
|
||||
ring->tail = I915_READ(LP_RING + RING_TAIL) & TAIL_ADDR;
|
||||
ring->space = ring->head - (ring->tail + 8);
|
||||
|
|
@ -470,7 +468,7 @@ int i915_emit_mi_flush(drm_device_t *dev, uint32_t flush)
|
|||
|
||||
flush_cmd |= flush;
|
||||
|
||||
i915_kernel_lost_context(dev);
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->ring);
|
||||
|
||||
BEGIN_RING(&dev_priv->ring, 4);
|
||||
OUT_RING(flush_cmd);
|
||||
|
|
@ -495,7 +493,7 @@ static int i915_dispatch_cmdbuffer(drm_device_t * dev,
|
|||
return DRM_ERR(EINVAL);
|
||||
}
|
||||
|
||||
i915_kernel_lost_context(dev);
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->ring);
|
||||
|
||||
count = nbox ? nbox : 1;
|
||||
|
||||
|
|
@ -533,7 +531,7 @@ static int i915_dispatch_batchbuffer(drm_device_t * dev,
|
|||
return DRM_ERR(EINVAL);
|
||||
}
|
||||
|
||||
i915_kernel_lost_context(dev);
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->ring);
|
||||
|
||||
count = nbox ? nbox : 1;
|
||||
|
||||
|
|
@ -645,7 +643,7 @@ static int i915_quiescent(drm_device_t * dev)
|
|||
{
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
i915_kernel_lost_context(dev);
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->ring);
|
||||
return i915_wait_ring(dev_priv, &dev_priv->ring, dev_priv->ring.Size - 8,
|
||||
__FUNCTION__);
|
||||
}
|
||||
|
|
@ -1040,6 +1038,8 @@ static int i915_hwz_render(drm_device_t *dev, struct drm_i915_hwz_render *render
|
|||
}
|
||||
|
||||
/* Prepare the Scene Render List */
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->hwz_ring);
|
||||
|
||||
BEGIN_RING(&dev_priv->hwz_ring, 2 * dev_priv->num_bins);
|
||||
|
||||
for (i = 0; i < dev_priv->num_bins; i++) {
|
||||
|
|
@ -1050,6 +1050,8 @@ static int i915_hwz_render(drm_device_t *dev, struct drm_i915_hwz_render *render
|
|||
hwz_outring = outring;
|
||||
|
||||
/* Write the HWB command stream */
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->hwb_ring);
|
||||
|
||||
BEGIN_RING(&dev_priv->hwb_ring, 12);
|
||||
OUT_RING(CMD_MI_LOAD_REGISTER_IMM);
|
||||
OUT_RING(BINCTL);
|
||||
|
|
|
|||
|
|
@ -151,7 +151,8 @@ extern drm_ioctl_desc_t i915_ioctls[];
|
|||
extern int i915_max_ioctl;
|
||||
|
||||
/* i915_dma.c */
|
||||
extern void i915_kernel_lost_context(drm_device_t * dev);
|
||||
extern void i915_kernel_lost_context(drm_i915_private_t * dev_priv,
|
||||
drm_i915_ring_buffer_t *ring);
|
||||
extern int i915_driver_load(struct drm_device *, unsigned long flags);
|
||||
extern void i915_driver_lastclose(drm_device_t * dev);
|
||||
extern void i915_driver_preclose(drm_device_t * dev, DRMFILE filp);
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ static void i915_vblank_tasklet(drm_device_t *dev)
|
|||
|
||||
spin_unlock(&dev_priv->swaps_lock);
|
||||
|
||||
i915_kernel_lost_context(dev);
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->ring);
|
||||
|
||||
upper[0] = upper[1] = 0;
|
||||
slice[0] = max(sarea_priv->pipeA_h / nhits, 1);
|
||||
|
|
@ -342,7 +342,7 @@ int i915_emit_irq(drm_device_t * dev)
|
|||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
RING_LOCALS;
|
||||
|
||||
i915_kernel_lost_context(dev);
|
||||
i915_kernel_lost_context(dev_priv, &dev_priv->ring);
|
||||
|
||||
DRM_DEBUG("%s\n", __FUNCTION__);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue