mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-09 05:08:04 +02:00
i915: Add HWZ initialization sub-ioctl to be called by the X server.
This commit is contained in:
parent
8c7eb2e726
commit
8aa2e4974d
2 changed files with 42 additions and 7 deletions
|
|
@ -762,6 +762,8 @@ static int i915_bmp_alloc(drm_device_t *dev)
|
|||
((BMP_SIZE / PAGE_SIZE - 1) << BMP_BUFFER_SIZE_SHIFT) |
|
||||
BMP_ENABLE);
|
||||
|
||||
DRM_INFO("BMP allocated and initialized\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -788,6 +790,8 @@ static void i915_bmp_free(drm_device_t *dev)
|
|||
drm_pci_free(dev, dev_priv->bmp);
|
||||
dev_priv->bmp = NULL;
|
||||
}
|
||||
|
||||
DRM_INFO("BMP freed\n");
|
||||
}
|
||||
|
||||
static int i915_bpl_alloc(drm_device_t *dev, drm_i915_hwz_t *hwz,
|
||||
|
|
@ -888,6 +892,11 @@ static int i915_hwz_alloc(drm_device_t *dev, drm_i915_hwz_t *hwz)
|
|||
(hwz->y1 & BIN_HMASK);
|
||||
int bins_per_row = hwz->pitch / BIN_WIDTH;
|
||||
|
||||
if (!dev_priv->bmp) {
|
||||
DRM_DEBUG("HWZ not initialized\n");
|
||||
return DRM_ERR(EINVAL);
|
||||
}
|
||||
|
||||
if (hwz->num_buffers > 3) {
|
||||
DRM_ERROR("Only up to 3 buffers allowed\n");
|
||||
return DRM_ERR(EINVAL);
|
||||
|
|
@ -898,11 +907,6 @@ static int i915_hwz_alloc(drm_device_t *dev, drm_i915_hwz_t *hwz)
|
|||
return DRM_ERR(EINVAL);
|
||||
}
|
||||
|
||||
if (!dev_priv->bmp && i915_bmp_alloc(dev)) {
|
||||
DRM_ERROR("Failed to allocate BMP\n");
|
||||
return DRM_ERR(ENOMEM);
|
||||
}
|
||||
|
||||
if (i915_bpl_alloc(dev, hwz, bins_per_row, bin_rows)) {
|
||||
DRM_ERROR("Failed to allocate BPLs\n");
|
||||
return DRM_ERR(ENOMEM);
|
||||
|
|
@ -930,15 +934,45 @@ static int i915_hwz_render(drm_device_t *dev, drm_i915_hwz_t *hwz)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int i915_hwz_init(drm_device_t *dev, drm_i915_hwz_t *hwz)
|
||||
{
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
if (dev_priv->bmp) {
|
||||
DRM_DEBUG("Already initialized\n");
|
||||
return DRM_ERR(EBUSY);
|
||||
}
|
||||
|
||||
if (i915_bmp_alloc(dev)) {
|
||||
DRM_ERROR("Failed to allocate BMP\n");
|
||||
return DRM_ERR(ENOMEM);
|
||||
}
|
||||
|
||||
DRM_INFO("HWZ initialized\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int i915_hwz(DRM_IOCTL_ARGS)
|
||||
{
|
||||
DRM_DEVICE;
|
||||
drm_i915_hwz_t hwz;
|
||||
|
||||
if (!dev->dev_private) {
|
||||
DRM_ERROR("called with no initialization\n");
|
||||
return DRM_ERR(EINVAL);
|
||||
}
|
||||
|
||||
DRM_COPY_FROM_USER_IOCTL(hwz, (drm_i915_hwz_t __user *) data,
|
||||
sizeof(hwz));
|
||||
|
||||
switch (hwz.op) {
|
||||
case DRM_I915_HWZ_INIT:
|
||||
if (!priv->master) {
|
||||
DRM_ERROR("Only master may initialize HWZ\n");
|
||||
return DRM_ERR(EINVAL);
|
||||
}
|
||||
return i915_hwz_init(dev, &hwz);
|
||||
case DRM_I915_HWZ_RENDER:
|
||||
DRM_INFO("i915 hwz render\n"
|
||||
/*, batch.start, batch.used, batch.num_cliprects*/);
|
||||
|
|
|
|||
|
|
@ -318,9 +318,10 @@ typedef struct drm_i915_mmio {
|
|||
|
||||
/* Hardware Zone Rendering Support:
|
||||
*/
|
||||
#define DRM_I915_HWZ_RENDER 1
|
||||
#define DRM_I915_HWZ_INIT 1
|
||||
#define DRM_I915_HWZ_ALLOC 2
|
||||
#define DRM_I915_HWZ_FREE 3
|
||||
#define DRM_I915_HWZ_RENDER 3
|
||||
#define DRM_I915_HWZ_FREE 4
|
||||
|
||||
typedef struct drm_i915_hwz {
|
||||
unsigned int op;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue