xvmc_driver->batch.ptr += 4;
}
+static void reset_batch(void)
+{
+ dri_bo *bo = xvmc_driver->batch.buf;
+
+ xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr = bo->virtual;
+ xvmc_driver->batch.size = bo->size;
+ xvmc_driver->batch.space = bo->size - 8;
+}
+
Bool intelInitBatchBuffer(void)
{
if ((xvmc_driver->batch.buf =
return False;
}
- drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
+ if (drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf)) {
+ drm_intel_bo_unreference(xvmc_driver->batch.buf);
+ return False;
+ }
- xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
- xvmc_driver->batch.size = BATCH_SIZE;
- xvmc_driver->batch.space = BATCH_SIZE;
- xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
+ reset_batch();
return True;
}
void intelFiniBatchBuffer(void)
{
- drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
+ if (xvmc_driver->batch.buf == NULL)
+ return;
drm_intel_bo_unreference(xvmc_driver->batch.buf);
}
-void intelFlushBatch(Bool refill)
+void intelFlushBatch(void)
{
- i965_end_batch();
+ dri_bo *bo;
- drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
+ i965_end_batch();
drm_intel_bo_exec(xvmc_driver->batch.buf,
xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr,
0, 0, 0);
- drm_intel_bo_unreference(xvmc_driver->batch.buf);
- if ((xvmc_driver->batch.buf =
- drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "batch buffer", BATCH_SIZE, 0x1000)) == NULL) {
- fprintf(stderr, "unable to alloc batch buffer\n");
+ bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "batch buffer", BATCH_SIZE, 0x1000);
+ if (bo != NULL && drm_intel_gem_bo_map_gtt(bo) == 0) {
+ drm_intel_bo_unreference(xvmc_driver->batch.buf);
+ xvmc_driver->batch.buf = bo;
+ } else {
+ if (bo != NULL)
+ drm_intel_bo_unreference(bo);
+ drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
}
- drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
-
- xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
- xvmc_driver->batch.size = BATCH_SIZE;
- xvmc_driver->batch.space = BATCH_SIZE;
- xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
-}
-
-void intelBatchbufferRequireSpace(int size)
-{
- assert(xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size <
- xvmc_driver->batch.size - 8);
- if (xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size
- >= xvmc_driver->batch.size - 8)
- intelFlushBatch(1);
+ reset_batch();
}
void intelBatchbufferData(const void *data, unsigned bytes, unsigned flags)
{
- intelBatchbufferRequireSpace(bytes);
+ assert(bytes <= xvmc_driver->batch.space);
memcpy(xvmc_driver->batch.ptr, data, bytes);
xvmc_driver->batch.ptr += bytes;
xvmc_driver->batch.space -= bytes;
}
drm_intel_bufmgr_gem_enable_reuse(xvmc_driver->bufmgr);
+ if (!intelInitBatchBuffer()) {
+ XFree(priv_data);
+ context->privData = NULL;
+
+ dri_bufmgr_destroy(xvmc_driver->bufmgr);
+ xvmc_driver = NULL;
+
+ return BadAlloc;
+ }
+
/* call driver hook.
* driver hook should free priv_data after return if success.*/
ret =
priv_data);
if (ret) {
XVMC_ERR("driver create context failed\n");
+ intelFiniBatchBuffer();
+
XFree(priv_data);
context->privData = NULL;
+
+ dri_bufmgr_destroy(xvmc_driver->bufmgr);
xvmc_driver = NULL;
return ret;
}
+
pthread_mutex_init(&xvmc_driver->ctxmutex, NULL);
- intelInitBatchBuffer();
intel_xvmc_dump_open();
return Success;