ilo: update winsys interface

The motivation is to kill tiling and pitch in struct intel_bo.  That requires
us to make tiling and pitch not queryable, and be passed around as function
parameters.
This commit is contained in:
Chia-I Wu
2013-06-12 16:38:38 +08:00
parent cdfb2163c4
commit 39226705b7
3 changed files with 66 additions and 63 deletions
+14 -7
View File
@@ -868,6 +868,8 @@ tex_create_bo(struct ilo_texture *tex,
struct ilo_screen *is = ilo_screen(tex->base.screen);
const char *name;
struct intel_bo *bo;
enum intel_tiling_mode tiling;
unsigned long pitch;
switch (tex->base.target) {
case PIPE_TEXTURE_1D:
@@ -900,13 +902,16 @@ tex_create_bo(struct ilo_texture *tex,
}
if (handle) {
bo = intel_winsys_import_handle(is->winsys, name,
tex->bo_width, tex->bo_height, tex->bo_cpp, handle);
bo = intel_winsys_import_handle(is->winsys, name, handle,
tex->bo_width, tex->bo_height, tex->bo_cpp,
&tiling, &pitch);
}
else {
bo = intel_winsys_alloc(is->winsys, name,
bo = intel_winsys_alloc_texture(is->winsys, name,
tex->bo_width, tex->bo_height, tex->bo_cpp,
tex->tiling, tex->bo_flags);
tex->tiling, tex->bo_flags, &pitch);
tiling = tex->tiling;
}
if (!bo)
@@ -916,8 +921,8 @@ tex_create_bo(struct ilo_texture *tex,
intel_bo_unreference(tex->bo);
tex->bo = bo;
tex->tiling = intel_bo_get_tiling(bo);
tex->bo_stride = intel_bo_get_pitch(bo);
tex->tiling = tiling;
tex->bo_stride = pitch;
return true;
}
@@ -1034,9 +1039,11 @@ tex_create(struct pipe_screen *screen,
static bool
tex_get_handle(struct ilo_texture *tex, struct winsys_handle *handle)
{
struct ilo_screen *is = ilo_screen(tex->base.screen);
int err;
err = intel_bo_export_handle(tex->bo, handle);
err = intel_winsys_export_handle(is->winsys, tex->bo,
tex->tiling, tex->bo_stride, handle);
return !err;
}
+32 -36
View File
@@ -59,12 +59,14 @@ struct intel_bo {
struct pipe_reference reference;
drm_intel_bo *bo;
enum intel_tiling_mode tiling;
unsigned long pitch;
};
int
intel_bo_export_handle(struct intel_bo *bo, struct winsys_handle *handle)
intel_winsys_export_handle(struct intel_winsys *winsys,
struct intel_bo *bo,
enum intel_tiling_mode tiling,
unsigned long pitch,
struct winsys_handle *handle)
{
int err = 0;
@@ -100,7 +102,7 @@ intel_bo_export_handle(struct intel_bo *bo, struct winsys_handle *handle)
if (err)
return err;
handle->stride = bo->pitch;
handle->stride = pitch;
return 0;
}
@@ -176,10 +178,13 @@ intel_bo_map_unsynchronized(struct intel_bo *bo)
return drm_intel_gem_bo_map_unsynchronized(bo->bo);
}
int
void
intel_bo_unmap(struct intel_bo *bo)
{
return drm_intel_bo_unmap(bo->bo);
int err;
err = drm_intel_bo_unmap(bo->bo);
assert(!err);
}
int
@@ -214,18 +219,6 @@ intel_bo_get_virtual(const struct intel_bo *bo)
return bo->bo->virtual;
}
enum intel_tiling_mode
intel_bo_get_tiling(const struct intel_bo *bo)
{
return bo->tiling;
}
unsigned long
intel_bo_get_pitch(const struct intel_bo *bo)
{
return bo->pitch;
}
void
intel_bo_reference(struct intel_bo *bo)
{
@@ -251,36 +244,38 @@ create_bo(void)
return NULL;
pipe_reference_init(&bo->reference, 1);
bo->tiling = INTEL_TILING_NONE;
bo->pitch = 0;
return bo;
}
struct intel_bo *
intel_winsys_alloc(struct intel_winsys *winsys,
const char *name,
int width, int height, int cpp,
enum intel_tiling_mode tiling,
unsigned long flags)
intel_winsys_alloc_texture(struct intel_winsys *winsys,
const char *name,
int width, int height, int cpp,
enum intel_tiling_mode tiling,
unsigned long flags,
unsigned long *pitch)
{
struct intel_bo *bo;
uint32_t real_tiling = tiling;
unsigned long pitch;
bo = create_bo();
if (!bo)
return NULL;
bo->bo = drm_intel_bo_alloc_tiled(winsys->bufmgr, name,
width, height, cpp, &real_tiling, &pitch, flags);
width, height, cpp, &real_tiling, pitch, flags);
if (!bo->bo) {
FREE(bo);
return NULL;
}
bo->tiling = real_tiling;
bo->pitch = pitch;
if (tiling != real_tiling) {
assert(!"tiling mis-match");
drm_intel_bo_unreference(bo->bo);
FREE(bo);
return NULL;
}
return bo;
}
@@ -318,12 +313,13 @@ intel_winsys_alloc_buffer(struct intel_winsys *winsys,
struct intel_bo *
intel_winsys_import_handle(struct intel_winsys *winsys,
const char *name,
const struct winsys_handle *handle,
int width, int height, int cpp,
const struct winsys_handle *handle)
enum intel_tiling_mode *tiling,
unsigned long *pitch)
{
struct intel_bo *bo;
const unsigned long pitch = handle->stride;
uint32_t tiling, swizzle;
uint32_t real_tiling, swizzle;
int err;
bo = create_bo();
@@ -343,7 +339,7 @@ intel_winsys_import_handle(struct intel_winsys *winsys,
{
const int fd = (int) handle->handle;
bo->bo = drm_intel_bo_gem_create_from_prime(winsys->bufmgr,
fd, height * pitch);
fd, height * handle->stride);
}
break;
#endif
@@ -356,15 +352,15 @@ intel_winsys_import_handle(struct intel_winsys *winsys,
return NULL;
}
err = drm_intel_bo_get_tiling(bo->bo, &tiling, &swizzle);
err = drm_intel_bo_get_tiling(bo->bo, &real_tiling, &swizzle);
if (err) {
drm_intel_bo_unreference(bo->bo);
FREE(bo);
return NULL;
}
bo->tiling = tiling;
bo->pitch = pitch;
*tiling = real_tiling;
*pitch = handle->stride;
return bo;
}
+20 -20
View File
@@ -109,17 +109,30 @@ intel_winsys_alloc_buffer(struct intel_winsys *winsys,
unsigned long flags);
struct intel_bo *
intel_winsys_alloc(struct intel_winsys *winsys,
const char *name,
int width, int height, int cpp,
enum intel_tiling_mode tiling,
unsigned long flags);
intel_winsys_alloc_texture(struct intel_winsys *winsys,
const char *name,
int width, int height, int cpp,
enum intel_tiling_mode tiling,
unsigned long flags,
unsigned long *pitch);
struct intel_bo *
intel_winsys_import_handle(struct intel_winsys *winsys,
const char *name,
const struct winsys_handle *handle,
int width, int height, int cpp,
const struct winsys_handle *handle);
enum intel_tiling_mode *tiling,
unsigned long *pitch);
/**
* Export a handle for inter-process sharing.
*/
int
intel_winsys_export_handle(struct intel_winsys *winsys,
struct intel_bo *bo,
enum intel_tiling_mode tiling,
unsigned long pitch,
struct winsys_handle *handle);
int
intel_winsys_check_aperture_space(struct intel_winsys *winsys,
@@ -145,12 +158,6 @@ intel_bo_get_offset(const struct intel_bo *bo);
void *
intel_bo_get_virtual(const struct intel_bo *bo);
enum intel_tiling_mode
intel_bo_get_tiling(const struct intel_bo *bo);
unsigned long
intel_bo_get_pitch(const struct intel_bo *bo);
/**
* Map/unmap \p bo for CPU access.
*
@@ -176,7 +183,7 @@ intel_bo_map_gtt(struct intel_bo *bo);
int
intel_bo_map_unsynchronized(struct intel_bo *bo);
int
void
intel_bo_unmap(struct intel_bo *bo);
/**
@@ -242,13 +249,6 @@ intel_bo_exec(struct intel_bo *bo, int used,
int
intel_bo_wait(struct intel_bo *bo, int64_t timeout);
/**
* Export a handle for inter-process sharing.
*/
int
intel_bo_export_handle(struct intel_bo *bo,
struct winsys_handle *handle);
/**
* Return true if \p bo is busy.
*/