@@ -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); | |||
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; | |||
} | |||
buffer = intel_be_buffer_from_handle(&intelScreen->base, | |||
"front", handle); | |||
if (!buffer) | |||
return; | |||
intelScreen->front.buffer = dri_bo(buffer); | |||
memset(&templat, 0, sizeof(templat)); | |||
templat.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET; |