i915: Added a intel be function to wrap a drm bo handle
This commit is contained in:
@@ -125,6 +125,37 @@ intel_be_user_buffer_create(struct pipe_winsys *winsys, void *ptr, unsigned byte
|
||||
return &buffer->base;
|
||||
}
|
||||
|
||||
struct pipe_buffer *
|
||||
intel_be_buffer_from_handle(struct intel_be_device *device,
|
||||
const char* name, unsigned handle)
|
||||
{
|
||||
struct intel_be_buffer *be_buf = malloc(sizeof(*be_buf));
|
||||
struct pipe_buffer *buffer;
|
||||
|
||||
if (!be_buf)
|
||||
goto err;
|
||||
|
||||
memset(be_buf, 0, sizeof(*be_buf));
|
||||
|
||||
driGenBuffers(device->staticPool, name, 1, &be_buf->driBO, 0, 0, 0);
|
||||
driBOSetReferenced(be_buf->driBO, handle);
|
||||
|
||||
if (0) /** XXX TODO check error */
|
||||
goto err_bo;
|
||||
|
||||
buffer = &be_buf->base;
|
||||
buffer->refcount = 1;
|
||||
buffer->alignment = 0;
|
||||
buffer->usage = 0;
|
||||
buffer->size = driBOSize(be_buf->driBO);
|
||||
|
||||
return buffer;
|
||||
err_bo:
|
||||
free(be_buf);
|
||||
err:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Surface functions.
|
||||
@@ -157,6 +188,7 @@ intel_i915_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s)
|
||||
assert((size_t)"intel_i915_surface_release is deprecated" & 0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Fence functions
|
||||
*/
|
||||
@@ -189,6 +221,7 @@ intel_be_fence_finish( struct pipe_winsys *sws,
|
||||
return driFenceFinish((struct _DriFenceObject *)fence, flag, 0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Misc functions
|
||||
*/
|
||||
|
||||
@@ -48,14 +48,23 @@ struct intel_be_buffer {
|
||||
struct _DriBufferObject *driBO;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a be buffer from a drm bo handle
|
||||
*
|
||||
* Takes a reference
|
||||
*/
|
||||
struct pipe_buffer *
|
||||
intel_be_buffer_from_handle(struct intel_be_device *device,
|
||||
const char* name, unsigned handle);
|
||||
|
||||
static INLINE struct intel_be_buffer *
|
||||
intel_be_buffer( struct pipe_buffer *buf )
|
||||
intel_be_buffer(struct pipe_buffer *buf)
|
||||
{
|
||||
return (struct intel_be_buffer *)buf;
|
||||
}
|
||||
|
||||
static INLINE struct _DriBufferObject *
|
||||
dri_bo( struct pipe_buffer *buf )
|
||||
dri_bo(struct pipe_buffer *buf)
|
||||
{
|
||||
return intel_be_buffer(buf)->driBO;
|
||||
}
|
||||
|
||||
@@ -49,28 +49,22 @@ intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys,
|
||||
static void
|
||||
intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys, unsigned handle)
|
||||
{
|
||||
struct intel_be_buffer *be_buf = malloc(sizeof(*be_buf));
|
||||
struct pipe_screen *screen = intelScreen->base.screen;
|
||||
struct pipe_texture *texture;
|
||||
struct pipe_texture templat;
|
||||
struct pipe_surface *surface;
|
||||
struct pipe_buffer *buffer = &be_buf->base;
|
||||
struct pipe_buffer *buffer;
|
||||
unsigned pitch;
|
||||
|
||||
assert(intelScreen->front.cpp == 4);
|
||||
|
||||
/* XXX create a intel_be function for this */
|
||||
{
|
||||
driGenBuffers(intelScreen->base.staticPool, "front", 1, &intelScreen->front.buffer, 0, 0, 0);
|
||||
driBOSetReferenced(intelScreen->front.buffer, handle);
|
||||
buffer = intel_be_buffer_from_handle(&intelScreen->base,
|
||||
"front", handle);
|
||||
|
||||
memset(be_buf, 0, sizeof(*be_buf));
|
||||
buffer->refcount = 1;
|
||||
buffer->alignment = 0;
|
||||
buffer->usage = 0;
|
||||
buffer->size = driBOSize(intelScreen->front.buffer);
|
||||
be_buf->driBO = intelScreen->front.buffer;
|
||||
}
|
||||
if (!buffer)
|
||||
return;
|
||||
|
||||
intelScreen->front.buffer = dri_bo(buffer);
|
||||
|
||||
memset(&templat, 0, sizeof(templat));
|
||||
templat.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
|
||||
|
||||
Reference in New Issue
Block a user