Most use cases just got the buffer from the texture and then called into one of the get_handle functions. Also with this patch it would be easier to move to a generic function for getting handles from textures and textures from handles, that is exposed via the screen.tags/mesa_7_6_rc1
@@ -29,6 +29,7 @@ | |||
#include "util/u_memory.h" | |||
#include "identity/id_drm.h" | |||
#include "identity/id_screen.h" | |||
#include "identity/id_public.h" | |||
#include "identity/id_screen.h" | |||
#include "identity/id_objects.h" | |||
@@ -79,81 +80,59 @@ identity_drm_create_context(struct drm_api *_api, | |||
return pipe; | |||
} | |||
static boolean | |||
identity_drm_buffer_from_texture(struct drm_api *_api, | |||
struct pipe_texture *_texture, | |||
struct pipe_buffer **_buffer, | |||
unsigned *stride) | |||
{ | |||
struct identity_texture *id_texture = identity_texture(_texture); | |||
struct identity_drm_api *id_api = identity_drm_api(_api); | |||
struct pipe_texture *texture = id_texture->texture; | |||
struct drm_api *api = id_api->api; | |||
struct pipe_buffer *buffer = NULL; | |||
boolean result; | |||
result = api->buffer_from_texture(api, texture, &buffer, stride); | |||
if (result && _buffer) | |||
buffer = identity_buffer_create(identity_screen(texture->screen), buffer); | |||
if (_buffer) | |||
*_buffer = buffer; | |||
else | |||
pipe_buffer_reference(&buffer, NULL); | |||
return result; | |||
} | |||
static struct pipe_buffer * | |||
identity_drm_buffer_from_handle(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
const char *name, | |||
unsigned handle) | |||
static struct pipe_texture * | |||
identity_drm_texture_from_shared_handle(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_texture *templ, | |||
const char *name, | |||
unsigned stride, | |||
unsigned handle) | |||
{ | |||
struct identity_screen *id_screen = identity_screen(_screen); | |||
struct identity_drm_api *id_api = identity_drm_api(_api); | |||
struct pipe_screen *screen = id_screen->screen; | |||
struct drm_api *api = id_api->api; | |||
struct pipe_buffer *result; | |||
struct pipe_texture *result; | |||
result = api->buffer_from_handle(api, screen, name, handle); | |||
result = api->texture_from_shared_handle(api, screen, templ, name, stride, handle); | |||
result = identity_buffer_create(identity_screen(_screen), result); | |||
result = identity_texture_create(identity_screen(_screen), result); | |||
return result; | |||
} | |||
static boolean | |||
identity_drm_handle_from_buffer(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_buffer *_buffer, | |||
unsigned *handle) | |||
identity_drm_shared_handle_from_texture(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_texture *_texture, | |||
unsigned *stride, | |||
unsigned *handle) | |||
{ | |||
struct identity_screen *id_screen = identity_screen(_screen); | |||
struct identity_buffer *id_buffer = identity_buffer(_buffer); | |||
struct identity_texture *id_texture = identity_texture(_texture); | |||
struct identity_drm_api *id_api = identity_drm_api(_api); | |||
struct pipe_screen *screen = id_screen->screen; | |||
struct pipe_buffer *buffer = id_buffer->buffer; | |||
struct pipe_texture *texture = id_texture->texture; | |||
struct drm_api *api = id_api->api; | |||
return api->handle_from_buffer(api, screen, buffer, handle); | |||
return api->shared_handle_from_texture(api, screen, texture, stride, handle); | |||
} | |||
static boolean | |||
identity_drm_global_handle_from_buffer(struct drm_api *_api, | |||
identity_drm_local_handle_from_texture(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_buffer *_buffer, | |||
struct pipe_texture *_texture, | |||
unsigned *stride, | |||
unsigned *handle) | |||
{ | |||
struct identity_screen *id_screen = identity_screen(_screen); | |||
struct identity_buffer *id_buffer = identity_buffer(_buffer); | |||
struct identity_texture *id_texture = identity_texture(_texture); | |||
struct identity_drm_api *id_api = identity_drm_api(_api); | |||
struct pipe_screen *screen = id_screen->screen; | |||
struct pipe_buffer *buffer = id_buffer->buffer; | |||
struct pipe_texture *texture = id_texture->texture; | |||
struct drm_api *api = id_api->api; | |||
return api->global_handle_from_buffer(api, screen, buffer, handle); | |||
return api->local_handle_from_texture(api, screen, texture, stride, handle); | |||
} | |||
static void | |||
@@ -169,19 +148,26 @@ identity_drm_destroy(struct drm_api *_api) | |||
struct drm_api * | |||
identity_drm_create(struct drm_api *api) | |||
{ | |||
struct identity_drm_api *id_api = CALLOC_STRUCT(identity_drm_api); | |||
struct identity_drm_api *id_api; | |||
if (!api) | |||
goto error; | |||
id_api = CALLOC_STRUCT(identity_drm_api); | |||
if (!id_api) | |||
return NULL; | |||
goto error; | |||
id_api->base.create_screen = identity_drm_create_screen; | |||
id_api->base.create_context = identity_drm_create_context; | |||
id_api->base.buffer_from_texture = identity_drm_buffer_from_texture; | |||
id_api->base.buffer_from_handle = identity_drm_buffer_from_handle; | |||
id_api->base.handle_from_buffer = identity_drm_handle_from_buffer; | |||
id_api->base.global_handle_from_buffer = identity_drm_global_handle_from_buffer; | |||
id_api->base.texture_from_shared_handle = identity_drm_texture_from_shared_handle; | |||
id_api->base.shared_handle_from_texture = identity_drm_shared_handle_from_texture; | |||
id_api->base.local_handle_from_texture = identity_drm_local_handle_from_texture; | |||
id_api->base.destroy = identity_drm_destroy; | |||
id_api->api = api; | |||
return &id_api->base; | |||
error: | |||
return api; | |||
} |
@@ -49,7 +49,7 @@ trace_drm_api(struct drm_api *_api) | |||
static struct pipe_screen * | |||
trace_drm_create_screen(struct drm_api *_api, int fd, | |||
struct drm_create_screen_arg *arg) | |||
struct drm_create_screen_arg *arg) | |||
{ | |||
struct trace_drm_api *tr_api = trace_drm_api(_api); | |||
struct drm_api *api = tr_api->api; | |||
@@ -67,7 +67,7 @@ trace_drm_create_screen(struct drm_api *_api, int fd, | |||
static struct pipe_context * | |||
trace_drm_create_context(struct drm_api *_api, | |||
struct pipe_screen *_screen) | |||
struct pipe_screen *_screen) | |||
{ | |||
struct trace_screen *tr_screen = trace_screen(_screen); | |||
struct trace_drm_api *tr_api = trace_drm_api(_api); | |||
@@ -84,89 +84,65 @@ trace_drm_create_context(struct drm_api *_api, | |||
return pipe; | |||
} | |||
static boolean | |||
trace_drm_buffer_from_texture(struct drm_api *_api, | |||
struct pipe_texture *_texture, | |||
struct pipe_buffer **_buffer, | |||
unsigned *stride) | |||
{ | |||
struct trace_texture *tr_texture = trace_texture(_texture); | |||
struct trace_drm_api *tr_api = trace_drm_api(_api); | |||
struct pipe_texture *texture = tr_texture->texture; | |||
struct drm_api *api = tr_api->api; | |||
struct pipe_buffer *buffer = NULL; | |||
boolean result; | |||
/* TODO trace call */ | |||
result = api->buffer_from_texture(api, texture, &buffer, stride); | |||
if (result && _buffer) | |||
buffer = trace_buffer_create(trace_screen(_texture->screen), buffer); | |||
if (_buffer) | |||
*_buffer = buffer; | |||
else | |||
pipe_buffer_reference(&buffer, NULL); | |||
return result; | |||
} | |||
static struct pipe_buffer * | |||
trace_drm_buffer_from_handle(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
const char *name, | |||
unsigned handle) | |||
static struct pipe_texture * | |||
trace_drm_texture_from_shared_handle(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_texture *templ, | |||
const char *name, | |||
unsigned stride, | |||
unsigned handle) | |||
{ | |||
struct trace_screen *tr_screen = trace_screen(_screen); | |||
struct trace_drm_api *tr_api = trace_drm_api(_api); | |||
struct pipe_screen *screen = tr_screen->screen; | |||
struct drm_api *api = tr_api->api; | |||
struct pipe_buffer *result; | |||
struct pipe_texture *result; | |||
/* TODO trace call */ | |||
result = api->buffer_from_handle(api, screen, name, handle); | |||
result = api->texture_from_shared_handle(api, screen, templ, name, stride, handle); | |||
result = trace_buffer_create(trace_screen(_screen), result); | |||
result = trace_texture_create(trace_screen(_screen), result); | |||
return result; | |||
} | |||
static boolean | |||
trace_drm_handle_from_buffer(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_buffer *_buffer, | |||
unsigned *handle) | |||
trace_drm_shared_handle_from_texture(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_texture *_texture, | |||
unsigned *stride, | |||
unsigned *handle) | |||
{ | |||
struct trace_screen *tr_screen = trace_screen(_screen); | |||
struct trace_buffer *tr_buffer = trace_buffer(_buffer); | |||
struct trace_texture *tr_texture = trace_texture(_texture); | |||
struct trace_drm_api *tr_api = trace_drm_api(_api); | |||
struct pipe_screen *screen = tr_screen->screen; | |||
struct pipe_buffer *buffer = tr_buffer->buffer; | |||
struct pipe_texture *texture = tr_texture->texture; | |||
struct drm_api *api = tr_api->api; | |||
/* TODO trace call */ | |||
return api->handle_from_buffer(api, screen, buffer, handle); | |||
return api->shared_handle_from_texture(api, screen, texture, stride, handle); | |||
} | |||
static boolean | |||
trace_drm_global_handle_from_buffer(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_buffer *_buffer, | |||
unsigned *handle) | |||
trace_drm_local_handle_from_texture(struct drm_api *_api, | |||
struct pipe_screen *_screen, | |||
struct pipe_texture *_texture, | |||
unsigned *stride, | |||
unsigned *handle) | |||
{ | |||
struct trace_screen *tr_screen = trace_screen(_screen); | |||
struct trace_buffer *tr_buffer = trace_buffer(_buffer); | |||
struct trace_texture *tr_texture = trace_texture(_texture); | |||
struct trace_drm_api *tr_api = trace_drm_api(_api); | |||
struct pipe_screen *screen = tr_screen->screen; | |||
struct pipe_buffer *buffer = tr_buffer->buffer; | |||
struct pipe_texture *texture = tr_texture->texture; | |||
struct drm_api *api = tr_api->api; | |||
/* TODO trace call */ | |||
return api->global_handle_from_buffer(api, screen, buffer, handle); | |||
return api->local_handle_from_texture(api, screen, texture, stride, handle); | |||
} | |||
static void | |||
@@ -197,10 +173,9 @@ trace_drm_create(struct drm_api *api) | |||
tr_api->base.create_screen = trace_drm_create_screen; | |||
tr_api->base.create_context = trace_drm_create_context; | |||
tr_api->base.buffer_from_texture = trace_drm_buffer_from_texture; | |||
tr_api->base.buffer_from_handle = trace_drm_buffer_from_handle; | |||
tr_api->base.handle_from_buffer = trace_drm_handle_from_buffer; | |||
tr_api->base.global_handle_from_buffer = trace_drm_global_handle_from_buffer; | |||
tr_api->base.texture_from_shared_handle = trace_drm_texture_from_shared_handle; | |||
tr_api->base.shared_handle_from_texture = trace_drm_shared_handle_from_texture; | |||
tr_api->base.local_handle_from_texture = trace_drm_local_handle_from_texture; | |||
tr_api->base.destroy = trace_drm_destroy; | |||
tr_api->api = api; | |||
@@ -42,21 +42,22 @@ struct drm_api | |||
* Special buffer functions | |||
*/ | |||
/*@{*/ | |||
boolean (*buffer_from_texture)(struct drm_api *api, | |||
struct pipe_texture *texture, | |||
struct pipe_buffer **buffer, | |||
unsigned *stride); | |||
struct pipe_buffer* (*buffer_from_handle)(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
const char *name, | |||
unsigned handle); | |||
boolean (*handle_from_buffer)(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_buffer *buffer, | |||
unsigned *handle); | |||
boolean (*global_handle_from_buffer)(struct drm_api *api, | |||
struct pipe_texture* | |||
(*texture_from_shared_handle)(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_texture *templ, | |||
const char *name, | |||
unsigned stride, | |||
unsigned handle); | |||
boolean (*shared_handle_from_texture)(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_texture *texture, | |||
unsigned *stride, | |||
unsigned *handle); | |||
boolean (*local_handle_from_texture)(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_buffer *buffer, | |||
struct pipe_texture *texture, | |||
unsigned *stride, | |||
unsigned *handle); | |||
/*@}*/ | |||
@@ -56,13 +56,6 @@ dri_surface_from_handle(struct drm_api *api, | |||
struct pipe_surface *surface = NULL; | |||
struct pipe_texture *texture = NULL; | |||
struct pipe_texture templat; | |||
struct pipe_buffer *buf = NULL; | |||
buf = api->buffer_from_handle(api, screen, "dri2 buffer", handle); | |||
if (!buf) { | |||
debug_printf("%s: Failed to get buffer from handle\n", __func__); | |||
return NULL; | |||
} | |||
memset(&templat, 0, sizeof(templat)); | |||
templat.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET; | |||
@@ -74,10 +67,8 @@ dri_surface_from_handle(struct drm_api *api, | |||
templat.height[0] = height; | |||
pf_get_block(templat.format, &templat.block); | |||
texture = screen->texture_blanket(screen, &templat, &pitch, buf); | |||
/* we don't need the buffer from this point on */ | |||
pipe_buffer_reference(&buf, NULL); | |||
texture = api->texture_from_shared_handle(api, screen, &templat, | |||
"dri2 buffer", pitch, handle); | |||
if (!texture) { | |||
debug_printf("%s: Failed to blanket the buffer with a texture\n", __func__); |
@@ -96,10 +96,6 @@ drm_create_texture(_EGLDisplay *dpy, | |||
if (!texture) | |||
goto err_tex; | |||
dev->api->buffer_from_texture(dev->api, texture, &buf, &pitch); | |||
if (!buf) | |||
goto err_buf; | |||
surface = screen->get_tex_surface(screen, | |||
texture, | |||
0, | |||
@@ -112,11 +108,11 @@ drm_create_texture(_EGLDisplay *dpy, | |||
scrn->tex = texture; | |||
scrn->surface = surface; | |||
scrn->buffer = buf; | |||
scrn->front.width = w; | |||
scrn->front.height = h; | |||
scrn->front.pitch = pitch; | |||
dev->api->handle_from_buffer(dev->api, screen, scrn->buffer, &scrn->front.handle); | |||
dev->api->local_handle_from_texture(dev->api, screen, texture, | |||
&scrn->front.pitch, &scrn->front.handle); | |||
if (0) | |||
goto err_handle; | |||
@@ -126,7 +122,6 @@ err_handle: | |||
pipe_surface_reference(&surface, NULL); | |||
err_surf: | |||
pipe_texture_reference(&texture, NULL); | |||
err_buf: | |||
err_tex: | |||
pipe_buffer_reference(&buf, NULL); | |||
return; |
@@ -46,13 +46,14 @@ | |||
#include <X11/extensions/dpms.h> | |||
#include "pipe/p_inlines.h" | |||
#include "util/u_rect.h" | |||
struct crtc_private | |||
{ | |||
drmModeCrtcPtr drm_crtc; | |||
/* hwcursor */ | |||
struct pipe_buffer *cursor_buf; | |||
struct pipe_texture *cursor_tex; | |||
unsigned cursor_handle; | |||
}; | |||
@@ -173,8 +174,8 @@ crtc_destroy(xf86CrtcPtr crtc) | |||
{ | |||
struct crtc_private *crtcp = crtc->driver_private; | |||
if (crtcp->cursor_buf) | |||
pipe_buffer_reference(&crtcp->cursor_buf, NULL); | |||
if (crtcp->cursor_tex) | |||
pipe_texture_reference(&crtcp->cursor_tex, NULL); | |||
drmModeFreeCrtc(crtcp->drm_crtc); | |||
xfree(crtcp); | |||
@@ -186,25 +187,42 @@ crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 * image) | |||
unsigned char *ptr; | |||
modesettingPtr ms = modesettingPTR(crtc->scrn); | |||
struct crtc_private *crtcp = crtc->driver_private; | |||
if (!crtcp->cursor_buf) { | |||
crtcp->cursor_buf = pipe_buffer_create(ms->screen, | |||
0, | |||
PIPE_BUFFER_USAGE_CPU_WRITE | | |||
PIPE_BUFFER_USAGE_GPU_READ, | |||
64*64*4); | |||
ms->api->handle_from_buffer(ms->api, | |||
ms->screen, | |||
crtcp->cursor_buf, | |||
&crtcp->cursor_handle); | |||
struct pipe_transfer *transfer; | |||
if (!crtcp->cursor_tex) { | |||
struct pipe_texture templat; | |||
unsigned pitch; | |||
memset(&templat, 0, sizeof(templat)); | |||
templat.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET; | |||
templat.tex_usage |= PIPE_TEXTURE_USAGE_PRIMARY; | |||
templat.target = PIPE_TEXTURE_2D; | |||
templat.last_level = 0; | |||
templat.depth[0] = 1; | |||
templat.format = PIPE_FORMAT_A8R8G8B8_UNORM; | |||
templat.width[0] = 64; | |||
templat.height[0] = 64; | |||
pf_get_block(templat.format, &templat.block); | |||
crtcp->cursor_tex = ms->screen->texture_create(ms->screen, | |||
&templat); | |||
ms->api->local_handle_from_texture(ms->api, | |||
ms->screen, | |||
crtcp->cursor_tex, | |||
&pitch, | |||
&crtcp->cursor_handle); | |||
} | |||
ptr = pipe_buffer_map(ms->screen, crtcp->cursor_buf, PIPE_BUFFER_USAGE_CPU_WRITE); | |||
if (ptr) | |||
memcpy(ptr, image, 64 * 64 * 4); | |||
pipe_buffer_unmap(ms->screen, crtcp->cursor_buf); | |||
transfer = ms->screen->get_tex_transfer(ms->screen, crtcp->cursor_tex, | |||
0, 0, 0, | |||
PIPE_TRANSFER_WRITE, | |||
0, 0, 64, 64); | |||
ptr = ms->screen->transfer_map(ms->screen, transfer); | |||
util_copy_rect(ptr, &crtcp->cursor_tex->block, | |||
transfer->stride, 0, 0, | |||
64, 64, (void*)image, 64 * 4, 0, 0); | |||
ms->screen->transfer_unmap(ms->screen, transfer); | |||
ms->screen->tex_transfer_destroy(transfer); | |||
} | |||
static void | |||
@@ -222,7 +240,7 @@ crtc_show_cursor(xf86CrtcPtr crtc) | |||
modesettingPtr ms = modesettingPTR(crtc->scrn); | |||
struct crtc_private *crtcp = crtc->driver_private; | |||
if (crtcp->cursor_buf) | |||
if (crtcp->cursor_tex) | |||
drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, | |||
crtcp->cursor_handle, 64, 64); | |||
} | |||
@@ -264,8 +282,8 @@ crtc_cursor_destroy(xf86CrtcPtr crtc) | |||
{ | |||
struct crtc_private *crtcp = crtc->driver_private; | |||
if (crtcp->cursor_buf) { | |||
pipe_buffer_reference(&crtcp->cursor_buf, NULL); | |||
if (crtcp->cursor_tex) { | |||
pipe_texture_reference(&crtcp->cursor_tex, NULL); | |||
} | |||
} | |||
@@ -44,7 +44,6 @@ | |||
typedef struct { | |||
PixmapPtr pPixmap; | |||
struct pipe_texture *tex; | |||
struct pipe_buffer *buf; | |||
struct pipe_fence_handle *fence; | |||
} *BufferPrivatePtr; | |||
@@ -133,8 +132,7 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count) | |||
if (!tex) | |||
FatalError("NO TEXTURE IN DRI2\n"); | |||
ms->api->buffer_from_texture(ms->api, tex, &buf, &stride); | |||
ms->api->global_handle_from_buffer(ms->api, ms->screen, buf, &handle); | |||
ms->api->shared_handle_from_texture(ms->api, ms->screen, tex, &stride, &handle); | |||
buffers[i].name = handle; | |||
buffers[i].attachment = attachments[i]; | |||
@@ -143,7 +141,6 @@ driCreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count) | |||
buffers[i].driverPrivate = &privates[i]; | |||
buffers[i].flags = 0; /* not tiled */ | |||
privates[i].pPixmap = pPixmap; | |||
privates[i].buf = buf; | |||
privates[i].tex = tex; | |||
} | |||
@@ -169,7 +166,6 @@ driDestroyBuffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count) | |||
private = buffers[i].driverPrivate; | |||
pipe_texture_reference(&private->tex, NULL); | |||
pipe_buffer_reference(&private->buf, NULL); | |||
ms->screen->fence_reference(ms->screen, &private->fence, NULL); | |||
if (private->pPixmap) |
@@ -396,7 +396,6 @@ xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out) | |||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; | |||
modesettingPtr ms = modesettingPTR(pScrn); | |||
struct exa_pixmap_priv *priv; | |||
struct pipe_buffer *buffer = NULL; | |||
unsigned handle; | |||
unsigned stride; | |||
@@ -412,9 +411,7 @@ xorg_exa_get_pixmap_handle(PixmapPtr pPixmap, unsigned *stride_out) | |||
return 0; | |||
} | |||
ms->api->buffer_from_texture(ms->api, priv->tex, &buffer, &stride); | |||
ms->api->handle_from_buffer(ms->api, ms->screen, buffer, &handle); | |||
pipe_buffer_reference(&buffer, NULL); | |||
ms->api->local_handle_from_texture(ms->api, ms->screen, priv->tex, &stride, &handle); | |||
if (stride_out) | |||
*stride_out = stride; | |||
@@ -15,10 +15,9 @@ struct drm_api intel_be_drm_api = | |||
.create_context = intel_be_create_context, | |||
/* intel_be_device.c */ | |||
.create_screen = intel_be_create_screen, | |||
.buffer_from_texture = intel_be_get_texture_buffer, | |||
.buffer_from_handle = intel_be_buffer_from_handle, | |||
.handle_from_buffer = intel_be_handle_from_buffer, | |||
.global_handle_from_buffer = intel_be_global_handle_from_buffer, | |||
.texture_from_shared_handle = intel_be_texture_from_shared_handle, | |||
.shared_handle_from_texture = intel_be_shared_handle_from_texture, | |||
.local_handle_from_texture = intel_be_local_handle_from_texture, | |||
.destroy = destroy, | |||
}; | |||
@@ -209,25 +209,7 @@ intel_be_surface_buffer_create(struct pipe_winsys *winsys, | |||
buf_size); | |||
} | |||
boolean | |||
intel_be_get_texture_buffer(struct drm_api *api, | |||
struct pipe_texture *texture, | |||
struct pipe_buffer **buffer, | |||
unsigned *stride) | |||
{ | |||
struct intel_be_device *dev; | |||
if (!texture) | |||
return FALSE; | |||
dev = intel_be_device(texture->screen->winsys); | |||
if (dev->softpipe) | |||
return softpipe_get_texture_buffer(texture, buffer, stride); | |||
else | |||
return i915_get_texture_buffer(texture, buffer, stride); | |||
} | |||
struct pipe_buffer * | |||
static struct pipe_buffer * | |||
intel_be_buffer_from_handle(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
const char* name, unsigned handle) | |||
@@ -259,30 +241,60 @@ err: | |||
return NULL; | |||
} | |||
boolean | |||
intel_be_handle_from_buffer(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_buffer *buffer, | |||
unsigned *handle) | |||
struct pipe_texture * | |||
intel_be_texture_from_shared_handle(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_texture *templ, | |||
const char* name, | |||
unsigned pitch, | |||
unsigned handle) | |||
{ | |||
struct pipe_buffer *buffer; | |||
buffer = intel_be_buffer_from_handle(api, | |||
screen, | |||
name, | |||
handle); | |||
if (!buffer) | |||
return NULL; | |||
return screen->texture_blanket(screen, templ, &pitch, buffer); | |||
} | |||
static boolean | |||
intel_be_get_texture_buffer(struct drm_api *api, | |||
struct pipe_texture *texture, | |||
struct pipe_buffer **buffer, | |||
unsigned *stride) | |||
{ | |||
struct intel_be_device *dev; | |||
if (!texture) | |||
return FALSE; | |||
*handle = intel_bo(buffer)->handle; | |||
return TRUE; | |||
dev = intel_be_device(texture->screen->winsys); | |||
if (dev->softpipe) | |||
return softpipe_get_texture_buffer(texture, buffer, stride); | |||
else | |||
return i915_get_texture_buffer(texture, buffer, stride); | |||
} | |||
boolean | |||
intel_be_global_handle_from_buffer(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_buffer *buffer, | |||
unsigned *handle) | |||
intel_be_shared_handle_from_texture(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_texture *texture, | |||
unsigned *pitch, | |||
unsigned *handle) | |||
{ | |||
struct intel_be_buffer *buf = intel_be_buffer(buffer); | |||
if (!buffer) | |||
struct pipe_buffer *buffer; | |||
struct intel_be_buffer *buf; | |||
if (!intel_be_get_texture_buffer(api, | |||
texture, | |||
&buffer, | |||
pitch)) | |||
return FALSE; | |||
buf = intel_be_buffer(buffer); | |||
if (!buf->flinked) { | |||
if (drm_intel_bo_flink(intel_bo(buffer), &buf->flink)) | |||
return FALSE; | |||
@@ -290,6 +302,30 @@ intel_be_global_handle_from_buffer(struct drm_api *api, | |||
} | |||
*handle = buf->flink; | |||
pipe_buffer_reference(&buffer, NULL); | |||
return TRUE; | |||
} | |||
boolean | |||
intel_be_local_handle_from_texture(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_texture *texture, | |||
unsigned *pitch, | |||
unsigned *handle) | |||
{ | |||
struct pipe_buffer *buffer; | |||
if (!intel_be_get_texture_buffer(api, | |||
texture, | |||
&buffer, | |||
pitch)) | |||
return FALSE; | |||
*handle = intel_bo(buffer)->handle; | |||
pipe_buffer_reference(&buffer, NULL); | |||
return TRUE; | |||
} | |||
@@ -57,45 +57,39 @@ struct intel_be_buffer { | |||
unsigned flink; | |||
}; | |||
/* | |||
* Wrapper for driver get_texture_buffer functions. | |||
*/ | |||
boolean | |||
intel_be_get_texture_buffer(struct drm_api *api, | |||
struct pipe_texture *texture, | |||
struct pipe_buffer **buffer, | |||
unsigned *stride); | |||
/** | |||
* Create a be buffer from a drm bo handle. | |||
* | |||
* Takes a reference. | |||
* Create a texture from a shared drm handle. | |||
*/ | |||
struct pipe_buffer * | |||
intel_be_buffer_from_handle(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
const char* name, unsigned handle); | |||
struct pipe_texture * | |||
intel_be_texture_from_shared_handle(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_texture *templ, | |||
const char* name, | |||
unsigned pitch, | |||
unsigned handle); | |||
/** | |||
* Gets a handle from a buffer. | |||
* Gets a shared handle from a texture. | |||
* | |||
* If buffer is destroyed handle may become invalid. | |||
* If texture is destroyed handle may become invalid. | |||
*/ | |||
boolean | |||
intel_be_handle_from_buffer(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_buffer *buffer, | |||
unsigned *handle); | |||
intel_be_shared_handle_from_texture(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_texture *texture, | |||
unsigned *pitch, | |||
unsigned *handle); | |||
/** | |||
* Gets the global handle from a buffer. | |||
* Gets the local handle from a texture. As used by KMS. | |||
* | |||
* If buffer is destroyed handle may become invalid. | |||
* If texture is destroyed handle may become invalid. | |||
*/ | |||
boolean | |||
intel_be_global_handle_from_buffer(struct drm_api *api, | |||
intel_be_local_handle_from_texture(struct drm_api *api, | |||
struct pipe_screen *screen, | |||
struct pipe_buffer *buffer, | |||
struct pipe_texture *texture, | |||
unsigned *pitch, | |||
unsigned *handle); | |||
static INLINE struct intel_be_buffer * |