mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 13:38:06 +02:00
i915g: Conversion to winsys handle
This commit is contained in:
parent
3f37f23d17
commit
0e1eb1b876
4 changed files with 137 additions and 165 deletions
|
|
@ -672,6 +672,58 @@ fail:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct pipe_texture *
|
||||
i915_texture_from_handle(struct pipe_screen * screen,
|
||||
const struct pipe_texture *templat,
|
||||
struct winsys_handle *whandle)
|
||||
{
|
||||
struct i915_screen *is = i915_screen(screen);
|
||||
struct i915_texture *tex;
|
||||
struct intel_winsys *iws = is->iws;
|
||||
struct intel_buffer *buffer;
|
||||
unsigned stride;
|
||||
|
||||
assert(screen);
|
||||
|
||||
buffer = iws->buffer_from_handle(iws, whandle, &stride);
|
||||
|
||||
/* Only supports one type */
|
||||
if (templat->target != PIPE_TEXTURE_2D ||
|
||||
templat->last_level != 0 ||
|
||||
templat->depth0 != 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tex = CALLOC_STRUCT(i915_texture);
|
||||
if (!tex)
|
||||
return NULL;
|
||||
|
||||
tex->base = *templat;
|
||||
pipe_reference_init(&tex->base.reference, 1);
|
||||
tex->base.screen = screen;
|
||||
|
||||
tex->stride = stride;
|
||||
|
||||
i915_miptree_set_level_info(tex, 0, 1, templat->width0, templat->height0, 1);
|
||||
i915_miptree_set_image_offset(tex, 0, 0, 0, 0);
|
||||
|
||||
tex->buffer = buffer;
|
||||
|
||||
return &tex->base;
|
||||
}
|
||||
|
||||
static boolean
|
||||
i915_texture_get_handle(struct pipe_screen * screen,
|
||||
struct pipe_texture *texture,
|
||||
struct winsys_handle *whandle)
|
||||
{
|
||||
struct i915_screen *is = i915_screen(screen);
|
||||
struct i915_texture *tex = (struct i915_texture *)texture;
|
||||
struct intel_winsys *iws = is->iws;
|
||||
|
||||
return iws->buffer_get_handle(iws, tex->buffer, whandle, tex->stride);
|
||||
}
|
||||
|
||||
static struct pipe_texture *
|
||||
i915_texture_blanket(struct pipe_screen * screen,
|
||||
const struct pipe_texture *base,
|
||||
|
|
@ -869,6 +921,8 @@ void
|
|||
i915_init_screen_texture_functions(struct i915_screen *is)
|
||||
{
|
||||
is->base.texture_create = i915_texture_create;
|
||||
is->base.texture_from_handle = i915_texture_from_handle;
|
||||
is->base.texture_get_handle = i915_texture_get_handle;
|
||||
is->base.texture_blanket = i915_texture_blanket;
|
||||
is->base.texture_destroy = i915_texture_destroy;
|
||||
is->base.get_tex_surface = i915_get_tex_surface;
|
||||
|
|
@ -878,53 +932,3 @@ i915_init_screen_texture_functions(struct i915_screen *is)
|
|||
is->base.transfer_unmap = i915_transfer_unmap;
|
||||
is->base.tex_transfer_destroy = i915_tex_transfer_destroy;
|
||||
}
|
||||
|
||||
struct pipe_texture *
|
||||
i915_texture_blanket_intel(struct pipe_screen *screen,
|
||||
struct pipe_texture *base,
|
||||
unsigned stride,
|
||||
struct intel_buffer *buffer)
|
||||
{
|
||||
struct i915_texture *tex;
|
||||
assert(screen);
|
||||
|
||||
/* Only supports one type */
|
||||
if (base->target != PIPE_TEXTURE_2D ||
|
||||
base->last_level != 0 ||
|
||||
base->depth0 != 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tex = CALLOC_STRUCT(i915_texture);
|
||||
if (!tex)
|
||||
return NULL;
|
||||
|
||||
tex->base = *base;
|
||||
pipe_reference_init(&tex->base.reference, 1);
|
||||
tex->base.screen = screen;
|
||||
|
||||
tex->stride = stride;
|
||||
|
||||
i915_miptree_set_level_info(tex, 0, 1, base->width0, base->height0, 1);
|
||||
i915_miptree_set_image_offset(tex, 0, 0, 0, 0);
|
||||
|
||||
tex->buffer = buffer;
|
||||
|
||||
return &tex->base;
|
||||
}
|
||||
|
||||
boolean
|
||||
i915_get_texture_buffer_intel(struct pipe_texture *texture,
|
||||
struct intel_buffer **buffer,
|
||||
unsigned *stride)
|
||||
{
|
||||
struct i915_texture *tex = (struct i915_texture *)texture;
|
||||
|
||||
if (!texture)
|
||||
return FALSE;
|
||||
|
||||
*stride = tex->stride;
|
||||
*buffer = tex->buffer;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ struct intel_buffer;
|
|||
struct intel_batchbuffer;
|
||||
struct pipe_texture;
|
||||
struct pipe_fence_handle;
|
||||
struct winsys_handle;
|
||||
|
||||
enum intel_buffer_usage
|
||||
{
|
||||
|
|
@ -128,6 +129,25 @@ struct intel_winsys {
|
|||
unsigned size, unsigned alignment,
|
||||
enum intel_buffer_type type);
|
||||
|
||||
/**
|
||||
* Creates a buffer from a handle.
|
||||
* Used to implement pipe_screen::texture_from_handle.
|
||||
* Also provides the stride information needed for the
|
||||
* texture via the stride argument.
|
||||
*/
|
||||
struct intel_buffer *(*buffer_from_handle)(struct intel_winsys *iws,
|
||||
struct winsys_handle *whandle,
|
||||
unsigned *stride);
|
||||
|
||||
/**
|
||||
* Used to implement pipe_screen::texture_get_handle.
|
||||
* The winsys might need the stride information.
|
||||
*/
|
||||
boolean (*buffer_get_handle)(struct intel_winsys *iws,
|
||||
struct intel_buffer *buffer,
|
||||
struct winsys_handle *whandle,
|
||||
unsigned stride);
|
||||
|
||||
/**
|
||||
* Fence a buffer with a fence reg.
|
||||
* Not to be confused with pipe_fence_handle.
|
||||
|
|
@ -204,23 +224,4 @@ struct intel_winsys {
|
|||
struct pipe_screen *i915_create_screen(struct intel_winsys *iws, unsigned pci_id);
|
||||
|
||||
|
||||
/**
|
||||
* Get the intel_winsys buffer backing the texture.
|
||||
*
|
||||
* TODO UGLY
|
||||
*/
|
||||
boolean i915_get_texture_buffer_intel(struct pipe_texture *texture,
|
||||
struct intel_buffer **buffer,
|
||||
unsigned *stride);
|
||||
|
||||
/**
|
||||
* Wrap a intel_winsys buffer with a texture blanket.
|
||||
*
|
||||
* TODO UGLY
|
||||
*/
|
||||
struct pipe_texture * i915_texture_blanket_intel(struct pipe_screen *screen,
|
||||
struct pipe_texture *tmplt,
|
||||
unsigned pitch,
|
||||
struct intel_buffer *buffer);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -38,99 +38,6 @@ intel_drm_get_device_id(unsigned int *device_id)
|
|||
fclose(file);
|
||||
}
|
||||
|
||||
static struct intel_buffer *
|
||||
intel_drm_buffer_from_handle(struct intel_drm_winsys *idws,
|
||||
const char* name, unsigned handle)
|
||||
{
|
||||
struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer);
|
||||
uint32_t tile = 0, swizzle = 0;
|
||||
|
||||
if (!buf)
|
||||
return NULL;
|
||||
|
||||
buf->magic = 0xDEAD1337;
|
||||
buf->bo = drm_intel_bo_gem_create_from_name(idws->pools.gem, name, handle);
|
||||
buf->flinked = TRUE;
|
||||
buf->flink = handle;
|
||||
|
||||
if (!buf->bo)
|
||||
goto err;
|
||||
|
||||
drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
|
||||
if (tile != INTEL_TILE_NONE)
|
||||
buf->map_gtt = TRUE;
|
||||
|
||||
return (struct intel_buffer *)buf;
|
||||
|
||||
err:
|
||||
FREE(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Exported functions
|
||||
*/
|
||||
|
||||
|
||||
static struct pipe_texture *
|
||||
intel_drm_texture_from_shared_handle(struct drm_api *api,
|
||||
struct pipe_screen *screen,
|
||||
struct pipe_texture *templ,
|
||||
const char* name,
|
||||
unsigned pitch,
|
||||
unsigned handle)
|
||||
{
|
||||
struct intel_drm_winsys *idws = intel_drm_winsys(i915_screen(screen)->iws);
|
||||
struct intel_buffer *buffer;
|
||||
|
||||
buffer = intel_drm_buffer_from_handle(idws, name, handle);
|
||||
if (!buffer)
|
||||
return NULL;
|
||||
|
||||
return i915_texture_blanket_intel(screen, templ, pitch, buffer);
|
||||
}
|
||||
|
||||
static boolean
|
||||
intel_drm_shared_handle_from_texture(struct drm_api *api,
|
||||
struct pipe_screen *screen,
|
||||
struct pipe_texture *texture,
|
||||
unsigned *pitch,
|
||||
unsigned *handle)
|
||||
{
|
||||
struct intel_drm_buffer *buf = NULL;
|
||||
struct intel_buffer *buffer = NULL;
|
||||
if (!i915_get_texture_buffer_intel(texture, &buffer, pitch))
|
||||
return FALSE;
|
||||
|
||||
buf = intel_drm_buffer(buffer);
|
||||
if (!buf->flinked) {
|
||||
if (drm_intel_bo_flink(buf->bo, &buf->flink))
|
||||
return FALSE;
|
||||
buf->flinked = TRUE;
|
||||
}
|
||||
|
||||
*handle = buf->flink;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
intel_drm_local_handle_from_texture(struct drm_api *api,
|
||||
struct pipe_screen *screen,
|
||||
struct pipe_texture *texture,
|
||||
unsigned *pitch,
|
||||
unsigned *handle)
|
||||
{
|
||||
struct intel_buffer *buffer = NULL;
|
||||
if (!i915_get_texture_buffer_intel(texture, &buffer, pitch))
|
||||
return FALSE;
|
||||
|
||||
*handle = intel_drm_buffer(buffer)->bo->handle;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
intel_drm_winsys_destroy(struct intel_winsys *iws)
|
||||
{
|
||||
|
|
@ -192,9 +99,6 @@ struct drm_api intel_drm_api =
|
|||
.name = "i915",
|
||||
.driver_name = "i915",
|
||||
.create_screen = intel_drm_create_screen,
|
||||
.texture_from_shared_handle = intel_drm_texture_from_shared_handle,
|
||||
.shared_handle_from_texture = intel_drm_shared_handle_from_texture,
|
||||
.local_handle_from_texture = intel_drm_local_handle_from_texture,
|
||||
.destroy = destroy,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
#include "state_tracker/drm_api.h"
|
||||
#include "intel_drm_winsys.h"
|
||||
#include "util/u_memory.h"
|
||||
|
||||
|
|
@ -52,6 +53,66 @@ err:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct intel_buffer *
|
||||
intel_drm_buffer_from_handle(struct intel_winsys *iws,
|
||||
struct winsys_handle *whandle,
|
||||
unsigned *stride)
|
||||
{
|
||||
struct intel_drm_winsys *idws = intel_drm_winsys(iws);
|
||||
struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer);
|
||||
uint32_t tile = 0, swizzle = 0;
|
||||
|
||||
if (!buf)
|
||||
return NULL;
|
||||
|
||||
buf->magic = 0xDEAD1337;
|
||||
buf->bo = drm_intel_bo_gem_create_from_name(idws->pools.gem, "gallium3d_from_handle", whandle->handle);
|
||||
buf->flinked = TRUE;
|
||||
buf->flink = whandle->handle;
|
||||
|
||||
if (!buf->bo)
|
||||
goto err;
|
||||
|
||||
drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
|
||||
if (tile != INTEL_TILE_NONE)
|
||||
buf->map_gtt = TRUE;
|
||||
|
||||
*stride = whandle->stride;
|
||||
|
||||
return (struct intel_buffer *)buf;
|
||||
|
||||
err:
|
||||
FREE(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static boolean
|
||||
intel_drm_buffer_get_handle(struct intel_winsys *iws,
|
||||
struct intel_buffer *buffer,
|
||||
struct winsys_handle *whandle,
|
||||
unsigned stride)
|
||||
{
|
||||
struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
|
||||
|
||||
if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
|
||||
if (!buf->flinked) {
|
||||
if (drm_intel_bo_flink(buf->bo, &buf->flink))
|
||||
return FALSE;
|
||||
buf->flinked = TRUE;
|
||||
}
|
||||
|
||||
whandle->handle = buf->flink;
|
||||
} else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
|
||||
whandle->handle = buf->bo->handle;
|
||||
} else {
|
||||
assert(!"unknown usage");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
whandle->stride = stride;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int
|
||||
intel_drm_buffer_set_fence_reg(struct intel_winsys *iws,
|
||||
struct intel_buffer *buffer,
|
||||
|
|
@ -146,6 +207,8 @@ void
|
|||
intel_drm_winsys_init_buffer_functions(struct intel_drm_winsys *idws)
|
||||
{
|
||||
idws->base.buffer_create = intel_drm_buffer_create;
|
||||
idws->base.buffer_from_handle = intel_drm_buffer_from_handle;
|
||||
idws->base.buffer_get_handle = intel_drm_buffer_get_handle;
|
||||
idws->base.buffer_set_fence_reg = intel_drm_buffer_set_fence_reg;
|
||||
idws->base.buffer_map = intel_drm_buffer_map;
|
||||
idws->base.buffer_unmap = intel_drm_buffer_unmap;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue