mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-30 22:20:27 +01:00
Make sure we are locked when creating drm buffer objects.
Don't place buffer objects on unfenced list when newly created. Fix a buffer object wait-for-idle deadlock.
This commit is contained in:
parent
9519785e29
commit
da56df9d72
6 changed files with 37 additions and 5 deletions
|
|
@ -190,11 +190,16 @@ driBOKernel(struct _DriBufferObject *buf)
|
|||
void
|
||||
driBOWaitIdle(struct _DriBufferObject *buf, int lazy)
|
||||
{
|
||||
assert(buf->private != NULL);
|
||||
struct _DriBufferPool *pool;
|
||||
void *priv;
|
||||
|
||||
_glthread_LOCK_MUTEX(buf->mutex);
|
||||
BM_CKFATAL(buf->pool->waitIdle(buf->pool, buf->private, lazy));
|
||||
pool = buf->pool;
|
||||
priv = buf->private;
|
||||
_glthread_UNLOCK_MUTEX(buf->mutex);
|
||||
|
||||
assert(priv != NULL);
|
||||
BM_CKFATAL(buf->pool->waitIdle(pool, priv, lazy));
|
||||
}
|
||||
|
||||
void *
|
||||
|
|
@ -296,7 +301,8 @@ driBOData(struct _DriBufferObject *buf,
|
|||
pool->destroy(pool, buf->private);
|
||||
if (!flags)
|
||||
flags = buf->flags;
|
||||
buf->private = pool->create(pool, size, flags, 0, buf->alignment);
|
||||
buf->private = pool->create(pool, size, flags, DRM_BO_HINT_DONT_FENCE,
|
||||
buf->alignment);
|
||||
if (!buf->private)
|
||||
BM_CKFATAL(-ENOMEM);
|
||||
BM_CKFATAL(pool->map(pool, buf->private,
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ pool_setstatic(struct _DriBufferPool *pool, unsigned long offset,
|
|||
return NULL;
|
||||
|
||||
ret = drmBOCreate(pool->fd, offset, size, 0, NULL, drm_bo_type_fake,
|
||||
flags, 0, buf);
|
||||
flags, DRM_BO_HINT_DONT_FENCE, buf);
|
||||
|
||||
if (ret) {
|
||||
free(buf);
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ createBPool(int fd, unsigned long bufSize, unsigned numBufs, unsigned flags,
|
|||
_glthread_INIT_MUTEX(p->mutex);
|
||||
|
||||
if (drmBOCreate(fd, 0, numBufs * bufSize, 0, NULL, drm_bo_type_dc,
|
||||
flags, 0, &p->kernelBO)) {
|
||||
flags, DRM_BO_HINT_DONT_FENCE, &p->kernelBO)) {
|
||||
free(p->bufs);
|
||||
free(p);
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -76,7 +76,9 @@ intel_bufferobj_release_region(struct intel_context *intel,
|
|||
*/
|
||||
driGenBuffers(intel->intelScreen->regionPool,
|
||||
"buffer object", 1, &intel_obj->buffer, 64, 0, 0);
|
||||
LOCK_HARDWARE(intel);
|
||||
driBOData(intel_obj->buffer, intel_obj->Base.Size, NULL, 0);
|
||||
UNLOCK_HARDWARE(intel);
|
||||
}
|
||||
|
||||
/* Break the COW tie to the region. Both the pbo and the region end
|
||||
|
|
@ -137,7 +139,9 @@ intel_bufferobj_data(GLcontext * ctx,
|
|||
if (intel_obj->region)
|
||||
intel_bufferobj_release_region(intel, intel_obj);
|
||||
|
||||
LOCK_HARDWARE(intel);
|
||||
driBOData(intel_obj->buffer, size, data, 0);
|
||||
UNLOCK_HARDWARE(intel);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ intel_region_alloc(intelScreenPrivate *intelScreen,
|
|||
GLuint cpp, GLuint pitch, GLuint height)
|
||||
{
|
||||
struct intel_region *region = calloc(sizeof(*region), 1);
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
|
||||
|
|
@ -107,7 +108,9 @@ intel_region_alloc(intelScreenPrivate *intelScreen,
|
|||
0,
|
||||
#endif
|
||||
0);
|
||||
LOCK_HARDWARE(intel);
|
||||
driBOData(region->buffer, pitch * cpp * height, NULL, 0);
|
||||
UNLOCK_HARDWARE(intel);
|
||||
return region;
|
||||
}
|
||||
|
||||
|
|
@ -392,6 +395,8 @@ void
|
|||
intel_region_release_pbo(intelScreenPrivate *intelScreen,
|
||||
struct intel_region *region)
|
||||
{
|
||||
struct intel_context *intel = intelScreenContext(intelScreen);
|
||||
|
||||
assert(region->buffer == region->pbo->buffer);
|
||||
region->pbo->region = NULL;
|
||||
region->pbo = NULL;
|
||||
|
|
@ -400,8 +405,11 @@ intel_region_release_pbo(intelScreenPrivate *intelScreen,
|
|||
|
||||
driGenBuffers(intelScreen->regionPool,
|
||||
"region", 1, ®ion->buffer, 64, 0, 0);
|
||||
|
||||
LOCK_HARDWARE(intel);
|
||||
driBOData(region->buffer,
|
||||
region->cpp * region->pitch * region->height, NULL, 0);
|
||||
UNLOCK_HARDWARE(intel);
|
||||
}
|
||||
|
||||
/* Break the COW tie to the pbo. Both the pbo and the region end up
|
||||
|
|
|
|||
|
|
@ -878,9 +878,19 @@ __driCreateNewScreen_20050727(__DRInativeDisplay * dpy, int scrn,
|
|||
static const __DRIversion ddx_expected = { 1, 5, 0 };
|
||||
static const __DRIversion dri_expected = { 4, 0, 0 };
|
||||
static const __DRIversion drm_expected = { 1, 7, 0 };
|
||||
int tmpContextID;
|
||||
GLuint tmpContext;
|
||||
|
||||
dri_interface = interface;
|
||||
|
||||
if (!(*dri_interface->createContext)(dpy, modes->screen,
|
||||
modes->fbconfigID,
|
||||
&tmpContextID, &tmpContext)) {
|
||||
fprintf(stderr, "Could not create temporary context.\n");
|
||||
return NULL;
|
||||
}
|
||||
DRM_LIGHT_LOCK(fd, &((drm_sarea_t *)pSAREA)->lock, tmpContext);
|
||||
|
||||
if (!driCheckDriDdxDrmVersions2("i915",
|
||||
dri_version, &dri_expected,
|
||||
ddx_version, &ddx_expected,
|
||||
|
|
@ -892,6 +902,10 @@ __driCreateNewScreen_20050727(__DRInativeDisplay * dpy, int scrn,
|
|||
ddx_version, dri_version, drm_version,
|
||||
frame_buffer, pSAREA, fd,
|
||||
internal_api_version, &intelAPI);
|
||||
|
||||
DRM_UNLOCK(fd, &((drm_sarea_t *)pSAREA)->lock, tmpContext);
|
||||
(void) (*dri_interface->destroyContext)(dpy, modes->screen, tmpContextID);
|
||||
|
||||
if (psp != NULL) {
|
||||
I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;
|
||||
*driver_modes = intelFillInModes(dri_priv->cpp * 8,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue